题
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;
问题是,为什么 "N*"
如果 substr
应该返回4个字节,并且它们将被解包为N?为什么要双重分配?
UPD:该代码是 狮身人面像 原生 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($响应,$ P, 4));
指定格式拆包从SUBSTR的数据时使用的()
N - 无符号长,通常是32位,大端字节序
不隶属于 StackOverflow