PHP распаковать вопрос - PullRequest
2 голосов
/ 12 января 2010
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;

Вопрос в том, почему "N*", если substr должен вернуть 4 байта, и они будут распакованы как N? И почему двойное назначение?

UPD : Этот код является частью Sphinx собственного коннектора PHP. После некоторого взлома кода выяснилось, что этот код извлекает 4-байтовое целое число. Но логика двойного присваивания и substr / N* мне до сих пор неясна. Я предлагаю вознаграждение, чтобы наконец понять это.

Ответы [ 3 ]

1 голос
/ 14 января 2010

Нам нужно просмотреть историю изменений файла, но некоторые возможности:

  1. Это остатки предыдущего алгоритма, который постепенно лишался функциональности, но никогда не очищался.
  2. Это типичный код спагетти, который мы все производим после плохой ночи.
  3. Это оптимизация, которая ускоряет код для больших входных строк.

Это все синонимы:

<?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)) );

?>

Я сделал типичный тест с повторением в тысячу раз с тремя целыми числами, и 1 намного быстрее. Однако аналогичный тест с 10 000 целых чисел показывает, что 1 является самым медленным: -!

0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

Будучи полнотекстовым движком, где производительность необходима, я бы осмелился сказать, что это оптимизация.

0 голосов
/ 15 января 2010

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

Указывает формат, используемый при распаковке данных из substr ()

N - длинный без знака, всегда 32 бита, порядок байтов с прямым порядком байтов

0 голосов
/ 12 января 2010

Код, вероятно, является ошибкой. Такого рода петли как раз и являются причиной существования * ...

...