高效 pre-perl-5.10 等效于 pack("Q>")

Posted

技术标签:

【中文标题】高效 pre-perl-5.10 等效于 pack("Q>")【英文标题】:Efficient pre-perl-5.10 equivalent of pack("Q>") 【发布时间】:2012-03-31 16:36:10 【问题描述】:

更新:Salva 正确地指出我对“Q”包模板的介绍是错误的。是 ">" 修饰符不会回到 5.8。

Perl 5.10 引入了 pack() 修饰符 ">",对于我使用“Q”的用例,它在 big endian 中打包了一个无符号四边形(64 位)值。

现在,我正在寻找一个有效的等价物

pack("Q>2", @ints)

其中@ints 包含两个64 位无符号整数。 “Q>2”表示“以大端字节顺序打包两个无符号四边形”。显然,我想要这个,因为我(至少暂时)绑定到 5.10 之前的 Perl。

Update2:实际上,经过进一步思考,应该像以下这样简单:

pack("N4", $ints[0] >> 32, $ints[0], $ints[1] >> 32, $ints[1])

似乎可以在我的 64 位 x86-64 Linux 上运行。为什么这可能与pack("Q>2", @ints) 不完全相同?任何特定于平台的问题?

反之亦然(即相当于 unpack("Q>2", @ints))?

【问题讨论】:

scalar reverse pack "Q2", reverse @ints ? 【参考方案1】:

Q 模式是在 perl 5.6 中引入的。您真正的问题可能是您试图在没有 64 位支持的情况下编译的 perl 中使用它。

不管怎样,你可以使用Math::Int64。

更新,举例:

use Math::Int64 qw(int64_to_native);
my $packed = join '', map int64_to_native($_), @ints;

如果您使用的是支持 Q 但不支持 Q> 的 64 位 perl,另一种选择是自己重新排序字节:

pack 'C*', reverse unpack 'C*', pack 'Q', $int;

【讨论】:

感谢您发现我完全记错了可移植性问题:它是 ">" 不会返回,所以最接近大端顺序的是“N”模板,它仅 32 位/无符号。所以在精神上,我的问题是成立的,但你的(以前非常有效的)答案不再适用了。对不起,我的错。 PS:这是一个 64 位的 perl。 这是我想出的反面:my @tmp = unpack("N4", $out2); my @orig= ( ($tmp[0] << 32) | $tmp[1], ($tmp[2] << 32) | $tmp[3] );

以上是关于高效 pre-perl-5.10 等效于 pack("Q>")的主要内容,如果未能解决你的问题,请参考以下文章

DoEvents 等效于 C++?

等效于 Linux 上的 Win32 性能计数器 [重复]

C#使用SQLBulkCopy或等效库高效批量删除50000条记录

msgpack可以提供更好的性能和相同的python的struct.pack()功能吗?

Bitbucket:git push 错误:pack-objects 死于信号 13

为啥'javascript_pack_tag'只适用于'body'而不是html'head'(Rails 6和webpack)