更新:Salva正确地指出我引入“Q”包模板是错误的。这是“>”不会回到5.8的修饰符。
Perl 5.10引入了pack()修饰符“>”,对于我的用例,“Q”在 big endian 中打包了一个无符号四(64bit)值。
现在,我正在寻找
的有效等价物pack("Q>2", @ints)
其中@ints包含两个64位无符号整数。 “Q> 2”表示“以big-endian字节顺序打包两个无符号四边形”。显然,我想要这个,因为我(至少暂时)与5.10之前的Perl相关联。
Update2:实际上,在进一步思考时,应该做以下简单的事情:
pack("N4", $ints[0] >> 32, $ints[0], $ints[1] >> 32, $ints[1])
似乎可以在我的64位x86-64 Linux上运行。有什么理由可能与pack("Q>2", @ints)
完全不同?任何特定于平台的事项?
相反的是什么(即相当于解包(“Q> 2”,@ ints))?
答案 0 :(得分:5)
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;