如何在 Perl 中使用“打包/解包”?

Posted

技术标签:

【中文标题】如何在 Perl 中使用“打包/解包”?【英文标题】:How do I use "pack/unpack" in Perl? 【发布时间】:2011-12-27 23:36:16 【问题描述】:

当我使用Ruby 语言解析数据时,我的数据被编码为 64 位网络字节顺序,如下所示:

def unpack_string(str)
   binary = str.unpack('m*').first
   binary.unpack('G*')
end

my_array_of_floats = unpack_string(str)

如何使用 Perl 的 pack/unpack 做同样的事情?

【问题讨论】:

谢谢,我已经参考了那个文档。如您的链接所示,但仍然无法弄清楚,您能给我更多提示吗? 【参考方案1】:

查看 Ruby 文档,

m 是 MIME base64 编码。 G 是双精度、网络(大端)字节顺序

Perl 的 unpack 不支持 base64,但 MIME::Base64 可以。

在 Perl 的 unpack 中,d 是双精度。您可以使用> 指定字节顺序。

use MIME::Base64 qw( decode_base64 );
my @nums = unpack 'd>*', decode_base64 $str;

> 是在 Perl 5.10 中引入的。

【讨论】:

感谢您的回复,我确实使用 MIME::Base64 来解码数据以获取您提到的二进制数据。我也试过你的建议,还是不行。 以下是一个示例数据:`我的$ STR1 ='eJxM3Xc8lt // OPDQosxoiYwWQlaavIiGklnaISQle932yF7Jyp5llS0lmSkpZaSozHprSDLa4 / F + VC / 5fu6X / 56Pc65zXq9z7vu6zrVuYF / P4ty8sW8W / QP7 + jkePFzFyOy + X + WSkDkDC9NTmH7SM8C + 5w1y37t6z2fI / dOuf + WRH // KP5pEHmX / + + F4YnN9vGST wF9gUAFRTy74EH9aaclRCvHxr4B4SnIt93K4NJ1nTPxVcdR4Anx / JdH2fu5dMSaD2v97YOD5C6Y72Ixz + L4gzzt7JonxPzvwxOgrjn1AjrcLTL2NnBTdm9OJnFYiw6qEnPXYv3IEfOtdgPjKeF / dcwg6U0LLC7kURFZASF8fdbF0eM81CHl + lLp83 + hICATdOk9945zGzjLwX';双精度,网络字节序,64位解码 因为它是使用zlib lib压缩的,所以我在使用unpack之前所做的是:<code> my $base64_decoded = decode_base64($str); my $uncompress_; my $input = \$base64_decoded; inflate $input => \$uncompress_; </code> 您好池上,感谢您的回复,我更新了我的perl版本,再试一次,它工作正常。再次感谢! @Peter Mortensen,spec 将其视为常规单词(“base64”,除非在句首)。实际值不区分大小写。

以上是关于如何在 Perl 中使用“打包/解包”?的主要内容,如果未能解决你的问题,请参考以下文章

Qt 等效于 Perl 打包/解包

获取 Perl 打包/解包模板的元素数量

Perl 打包/解包和二进制字符串的长度

Perl 中字符串的最快校验位例程是啥?

打包/解包 - 小端 - 64 位 - 问题

PyInstaller打包、解包与反编译.pyc文件