我在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
注意:打开包装是进行转换的正确方法