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

问题是,为什么 "N*" 如果 substr 应该返回4个字节,并且它们将被解包为N?为什么要双重分配?

UPD:该代码是 狮身人面像 原生 PHP 连接器。经过一些代码修改后,我们发现这段代码提取了 4 字节整数。但是双重赋值背后的逻辑和 substr / N* 我仍然不清楚。我提供悬赏以最终理解它。

有帮助吗?

解决方案

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

  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

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

其他提示

的代码是可能的错误。这种循环也正是*存在...

的原因
  

解包( “N *”,SUBSTR($响应,$ P,   4));

指定格式拆包从SUBSTR的数据时使用的()

N - 无符号长,通常是32位,大端字节序

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top