list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;问题是,如果"N*"应该返回4个字节,那么为什么要将substr解压缩为N呢?为什么是双重任务?
UPD:此代码是狮身人面像本机狮身人面像连接器的一部分。经过一些代码黑客攻击后,很明显,这段代码提取了4字节整数。但是双重分配和substr / N*背后的逻辑对我来说还不清楚。我提供一笔赏金让我终于明白这一点。
发布于 2010-01-14 18:00:03
我们需要查看该文件的修订历史,但有一些可能性是:
这些都是同义词:
<?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作为一个必须具备性能的全文引擎,我敢说这是一个优化。
发布于 2010-01-12 14:11:57
代码可能是个bug。这种循环正是*存在的原因.
发布于 2010-01-14 23:18:02
解包( "N*",substr ( $response,$p,4) );
指定从substr()解压缩数据时使用的格式。
N-无符号长,总是32位,大端字节顺序
https://stackoverflow.com/questions/2049420
复制相似问题