如何在 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 中使用“打包/解包”?的主要内容,如果未能解决你的问题,请参考以下文章