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 打包/解包和二进制字符串的长度的主要内容,如果未能解决你的问题,请参考以下文章