list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
问题是,为什么"N*"
ifsubstr
应该返回 4 个字节,而它们会被解包为 N?为什么要双重分配?
UPD:此代码是Sphinx原生 PHP 连接器的一部分。经过一些代码破解后,很明显该代码提取了 4 字节整数。substr
但是双重赋值和/背后的逻辑N*
我仍然不清楚。我提供赏金以最终理解它。
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
问题是,为什么"N*"
ifsubstr
应该返回 4 个字节,而它们会被解包为 N?为什么要双重分配?
UPD:此代码是Sphinx原生 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 位,大端字节序
该代码可能是一个错误。这种循环正是*
存在的原因……