PHP解压问题

发布于 2024-08-17 18:09:59 字数 400 浏览 7 评论 0原文

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

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

UPD:此代码是 Sphinx 本机 PHP 连接器的一部分。经过一些代码修改后,我们发现这段代码提取了 4 字节整数。但双重赋值和 substr / N* 背后的逻辑对我来说仍然不清楚。我提供悬赏以最终理解它。

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

The question is, why "N*" if substr should return 4 bytes, and they will be unpacked as N? And why double assignment?

UPD: This code is part of Sphinx native PHP connector. After some code hacking it became clear that this code extracts 4-byte integer. But logic behind double assignment and substr / N* is still unclear to me. I'm offering a bounty to finally understand it.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

泼猴你往哪里跑 2024-08-24 18:09:59

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

  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

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

We'd need to see the revision history of the file but some possibilities are:

  1. These are the remains of a previous algorithm that was progressively stripped of functionality but never cleaned up.
  2. It's the typical spaghetti code we all produce after a bad night.
  3. It's an optimization that speeds up the code for large input strings.

These are all synonyms:

<?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)) );

?>

I did the typical repeat-a-thousand-times benchmark with three integers and 1 is way faster. However, a similar test with 10,000 integers shows that 1 is the slowest :-!

0.82868695259094 seconds
0.0046610832214355 seconds
0.0029149055480957 seconds

Being a full-text engine where performance is a must, I'd dare say it's an optimization.

彩虹直至黑白 2024-08-24 18:09:59

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

The code is probably a bug. This kind of loop is precisely the reason why * exists...

苏大泽ㄣ 2024-08-24 18:09:59

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

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

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

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

Specifies the format to use when unpacking the data from substr()

N - unsigned long, always 32 bit, big endian byte order

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文