3

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

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

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

pack("Q>2", @ints)

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

更新2:实际上,经过进一步思考,应该做如下简单的事情:

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

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

反过来是什么(即相当于 unpack("Q>2", @ints))?

4

1 回答 1

5

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

无论如何,您可以使用Math::Int64

更新,一个例子:

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

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

pack 'C*', reverse unpack 'C*', pack 'Q', $int;
于 2012-03-15T08:41:33.610 回答