高效 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>")的主要内容,如果未能解决你的问题,请参考以下文章
C#使用SQLBulkCopy或等效库高效批量删除50000条记录
msgpack可以提供更好的性能和相同的python的struct.pack()功能吗?
Bitbucket:git push 错误:pack-objects 死于信号 13
为啥'javascript_pack_tag'只适用于'body'而不是html'head'(Rails 6和webpack)