高效的pre-perl-5.10等效包装("Q>")

tse*_*see 3 perl perl5.10

更新:Salva正确地指出我对"Q"包模板的引入是错误的.这是">"修饰符,不会回到5.8.

Perl 5.10引入了pack()修饰符">",对于我的用例,"Q"包含大端的无符号四(64位)值.

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

pack("Q>2", @ints)
Run Code Online (Sandbox Code Playgroud)

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

Update2:实际上,经过进一步思考,下面应该做的事情应该是:

pack("N4", $ints[0] >> 32, $ints[0], $ints[1] >> 32, $ints[1])
Run Code Online (Sandbox Code Playgroud)

似乎可以在我的64位x86-64 Linux上运行.有什么理由可能不完全相同pack("Q>2", @ints)?任何特定于平台的事项?

相反的是什么(即相当于解包("Q> 2",@ ints))?

sal*_*lva 5

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

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

更新,一个例子:

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

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

pack 'C*', reverse unpack 'C*', pack 'Q', $int;
Run Code Online (Sandbox Code Playgroud)

  • 这就是我提出的与背包相反的结果:`my @tmp = unpack("N4",$ out2); my @ orig =(($ tmp [0] << 32)| $ tmp [1],($ tmp [2] << 32)| $ tmp [3]);` (2认同)