PHP açmak soru

3 Cevap php
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;

Soru, neden "N*" if substr 4 bayt dönmek gerekir, ve onlar N olarak açmak olacak? Ve neden çift atama?

UPD: Bu kod Sphinx doğal PHP soketinin bir parçasıdır. Hack bazı kod bu kod 4-bayt tamsayı ayıklar netleşti sonra. Ancak çift atama ve arkasındaki mantık substr / N* hala bana belirsizdir. Sonunda onu anlamak için bir ödül teklif ediyorum.

3 Cevap

Biz dosyanın revizyon geçmişini görmek gerekir ama bazı olasılıklar şunlardır:

  1. Bu kademeli işlevsellik elimden ama asla temizlenmiş bir önceki algoritmanın kalıntıları vardır.
  2. Hepimizin kötü bir gece sonra üretmek tipik spagetti kod.
  3. Büyük giriş dizeleri için kod hızlandıran bir optimizasyon bulunuyor.

Bunların hepsi eş anlamlı bulunmaktadır:

<?php

$packed = pack('N*', 100, 200, 300);

// 1
var_dump( unpack('N*', $packed) );

// 2
var_dump( unpack('N*', substr($packed, 0, 4)) );
var_dump( unpack('N*', substr($packed, 4, 4)) );
var_dump( unpack('N*', substr($packed, 8, 4)) );

// 3
var_dump( unpack('N', substr($packed, 0, 4)) );
var_dump( unpack('N', substr($packed, 4, 4)) );
var_dump( unpack('N', substr($packed, 8, 4)) );

?>

Ben üç tamsayılar ile tipik tekrar-bir-bin kere kriter yaptım ve 1 yol hızlıdır. Ancak, 10.000 tamsayılar ile benzer bir test 1 yavaş olduğunu gösterir: -!

0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

Performans bir zorunluluktur bir tam metin motoru olan, ben bir optimizasyon söylemek cesaret ediyorum.

Kod muhtemelen bir hatadır. Döngünün Bu tür hassas * var nedeni de budur ...

unpack ( "N*", substr ( $response, $p, 4 ) );

Substr gelen veri paketlerini açarken biçimi (kullanılacağını belirtir)

N - işaretsiz uzun, her zaman 32 bit, kıymetli bayt baştadır