首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP解包问题

PHP解包问题
EN

Stack Overflow用户
提问于 2010-01-12 14:02:18
回答 3查看 1.1K关注 0票数 2
代码语言:javascript
复制
list(,$nfields) = unpack ( "N*", substr ( $response, $p, 4 ) ); $p += 4;

问题是,如果"N*"应该返回4个字节,那么为什么要将substr解压缩为N呢?为什么是双重任务?

UPD:此代码是狮身人面像本机狮身人面像连接器的一部分。经过一些代码黑客攻击后,很明显,这段代码提取了4字节整数。但是双重分配和substr / N*背后的逻辑对我来说还不清楚。我提供一笔赏金让我终于明白这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-14 18:00:03

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

  1. 这些都是以前的算法的残余,它被逐步地剥夺了功能,但从未被清理过。
  2. 这是典型的意大利面代码,我们都是在一个糟糕的夜晚制作出来的。
  3. 这是一个优化,可以加快大型输入字符串的代码速度。

这些都是同义词:

代码语言:javascript
复制
<?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是最慢的:-!

代码语言:javascript
复制
0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

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

票数 1
EN

Stack Overflow用户

发布于 2010-01-12 14:11:57

代码可能是个bug。这种循环正是*存在的原因.

票数 0
EN

Stack Overflow用户

发布于 2010-01-14 23:18:02

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

指定从substr()解压缩数据时使用的格式。

N-无符号长,总是32位,大端字节顺序

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2049420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档