PHP распаковывать вопрос
-
20-09-2019 - |
Вопрос
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
Вопрос в том, почему "N*"
если substr
Должны вернуть 4 байта, и они будут распаковывать как n? А зачем двойное задание?
Обновляемый: Этот код является частью Сфинкс Нативный разъем PHP. После некоторого взлома кода стало ясно, что этот код извлекает 4-байтовое целое число. Но логика двойного назначения и substr
/ N*
Мне все еще неясно. Я предлагаю награду, чтобы наконец понять это.
Решение
Нам нужно увидеть историю пересмотра файла, но некоторые возможности:
- Это остатки предыдущего алгоритма, который постепенно лишился функциональности, но никогда не очищался.
- Это типичный код спагетти, который мы все производим после плохой ночи.
- Это оптимизация, которая ускоряет код для больших входных строк.
Это все синонимы:
<?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 -битный, большой эндийский байт -заказ