我在Perl 5中有一个特定的问题要解决(使用最少的外部依赖,如果可能的话,与版本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
有什么想法吗?
发布于 2020-04-13 18:05:14
你就快成功了,下面是你的作品:
say unpack 'Q', pack 'C*', reverse @data;
# ~~~~~~~
这意味着你需要相反的字节顺序,也就是以下面的方式打包:
unpack 'Q>', pack 'C*', @data;
# ^
发布于 2020-04-14 02:21:03
使用以下代码即可达到预期效果
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
注意:解包是进行转换的正确方法
https://stackoverflow.com/questions/61193826
复制