如何在perl中将字节数组转换为int64



我在Perl5中有一个特定的问题需要解决(如果可能的话,使用最小的外部依赖关系,与5.12版本兼容(,与解码这样的字节数组有关:

my @data = (0x00, 0x00, 0x00, 0x03, 0x84, 0x14, 0x40, 0x32);

我想提取一个这样的数字:15100821554

我尝试了几种包装/开箱的变体,但没有成功,比如

say(unpack("Q", pack("C*", @data)));

打印3620916657624449024

go中的等效代码类似于

data := []byte{0x00, 0x00, 0x00, 0x03, 0x84, 0x14, 0x40, 0x32}
deciseconds := int64(binary.BigEndian.Uint64(data))

可以在此处执行:https://play.golang.org/p/I2J45H-sn-H

有什么想法吗?

你几乎到了,下面的工作:

say unpack 'Q', pack 'C*', reverse @data;
#                          ~~~~~~~

这意味着您需要相反的endianness,它以以下方式转换为pack:

unpack 'Q>', pack 'C*', @data;
#        ^

使用以下代码可以实现所需的结果

use strict;
use warnings;
use feature 'say';
my $num = 0;
my @data = (0x00, 0x00, 0x00, 0x03, 0x84, 0x14, 0x40, 0x32);
$num = ($num<<8) + $_ for @data;
say $num;

输出

15100821554

注意:打开包装是进行转换的正确方法

最新更新