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

问题是,为什么"N*"ifsubstr应该返回 4 个字节,而它们会被解包为 N?为什么要双重分配?

UPD:此代码是Sphinx原生 PHP 连接器的一部分。经过一些代码破解后,很明显该代码提取了 4 字节整数。substr但是双重赋值和/背后的逻辑N*我仍然不清楚。我提供赏金以最终理解它。

4

3 回答 3

1

我们需要查看文件的修订历史,但一些可能性是:

  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

作为一个性能是必须的全文引擎,我敢说这是一种优化。

于 2010-01-14T18:00:03.380 回答
0

解包(“N*”,substr($response,$p,4));

指定从 substr() 解包数据时使用的格式

N - 无符号长,始终为 32 位,大端字节序

于 2010-01-14T23:18:02.267 回答
0

该代码可能是一个错误。这种循环正是*存在的原因……

于 2010-01-12T14:11:57.523 回答