Вопрос

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

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

Обновляемый: Этот код является частью Сфинкс Нативный разъем PHP. После некоторого взлома кода стало ясно, что этот код извлекает 4-байтовое целое число. Но логика двойного назначения и substr / N* Мне все еще неясно. Я предлагаю награду, чтобы наконец понять это.

Это было полезно?

Решение

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

  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

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

Другие советы

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

распаковать ("n*", substr ($ response, $ p, 4));

Определяет формат для использования при распаковке данных от substr ()

N - без подписи длинный, всегда 32 -битный, большой эндийский байт -заказ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top