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

Posted

技术标签:

【中文标题】Perl 打包/解包和二进制字符串的长度【英文标题】:Perl pack/unpack and length of binary string 【发布时间】:2011-11-30 03:42:03 【问题描述】:

考虑这个简短的例子:

$a = pack("d",255);
print length($a)."\n";
# Prints 8

$aa = pack("ddddd", 255,123,0,45,123);
print length($aa)."\n";
# Prints 40

@unparray = unpack("d "x5, $aa);
print scalar(@unparray)."\n";
# Prints 5

print length($unparray[0])."\n"
# Prints 3

printf "%d\n", $unparray[0] '
# Prints 255

# As a one-liner:
# perl -e '$a = pack("d",255); print length($a)."\n"; $aa = pack("dd", 255,123,0,45,123); print length($aa)."\n"; @unparray = unpack("d "x5, $aa); print scalar(@unparray)."\n"; print length($unparray[0])."\n"; printf "%d\n", $unparray[0] '

现在,我希望双精度浮点数为 8 个字节,所以第一个 length($a) 是正确的。但是为什么解包后的长度 (length($unparray[0])) 报告 3 - 当我试图以完全相同的方式返回时(双精度,即 8 个字节) - 并且项目的值 (255) 被正确保留?

【问题讨论】:

【参考方案1】:

通过解压你打包的东西,你得到了原来的值,第一个值是255。255的字符串化是“255”,3个字符长,这就是length告诉你的。

【讨论】:

感谢@hobbs; pack 从 Integer 变为“双值打包字节串”;而反过来(解包),我希望以某种方式从“双值压缩字节串”到$unparray 中的双精度浮点数;但似乎这些是$unparray 中的字符串!感谢您澄清这一点 - 干杯! @sdaau,您确实在@unparray 中获得了双精度浮点数。 length 查找字符串的长度,因此它需要一个字符串,因此如果需要它会对其参数进行字符串化。 感谢@ikegami - “length 查找字符串的长度”似乎是我无法理解的绊脚石......干杯!

以上是关于Perl 打包/解包和二进制字符串的长度的主要内容,如果未能解决你的问题,请参考以下文章

Perl 解包和换行符

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

Qt 等效于 Perl 打包/解包

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

关于 perl 解包

使用apktool解包和打包apk