首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在Perl语言中将字节数组转换为int64

如何在Perl语言中将字节数组转换为int64
EN

Stack Overflow用户
提问于 2020-04-14 02:01:28
回答 2查看 57关注 0票数 2

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

代码语言:javascript
代码运行次数:0
运行
复制
my @data = (0x00, 0x00, 0x00, 0x03, 0x84, 0x14, 0x40, 0x32);

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

我尝试了几种打包/解包的变体,但都没有成功,比如

代码语言:javascript
代码运行次数:0
运行
复制
say(unpack("Q", pack("C*", @data)));

打印3620916657624449024

go中的等效代码如下所示

代码语言:javascript
代码运行次数:0
运行
复制
data := []byte{0x00, 0x00, 0x00, 0x03, 0x84, 0x14, 0x40, 0x32}
deciseconds := int64(binary.BigEndian.Uint64(data))

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

有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-04-14 02:05:14

你就快成功了,下面是你的作品:

代码语言:javascript
代码运行次数:0
运行
复制
say unpack 'Q', pack 'C*', reverse @data;
#                          ~~~~~~~

这意味着你需要相反的字节顺序,也就是以下面的方式打包:

代码语言:javascript
代码运行次数:0
运行
复制
unpack 'Q>', pack 'C*', @data;
#        ^
票数 5
EN

Stack Overflow用户

发布于 2020-04-14 10:21:03

使用以下代码即可达到预期效果

代码语言:javascript
代码运行次数:0
运行
复制
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;

输出

代码语言:javascript
代码运行次数:0
运行
复制
15100821554

注意:解包是进行转换的正确方法

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61193826

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档