如何在Perl中解压缩双精度值?

时间:2011-11-30 04:02:17

标签: perl bytearray unpack

从这个问题:

bytearray - Perl pack/unpack and length of binary string - Stack Overflow

我已经了解到下面代码段中的@unparray = unpack("d "x5, $aa);会导致unparray中的字符串项 - 而不是双精度数字(正如我所料)。

是否有可能以某种方式从下面的代码段中的$aa字节字符串中获取一个双精度值数组?:

$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

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

非常感谢任何答案,
干杯!

2 个答案:

答案 0 :(得分:4)

是什么让你觉得它没有存储为双倍?

use feature qw( say );

use Config      qw( %Config );
use Devel::Peek qw( Dump );

my @a = unpack "d5", pack "d5", 255,123,0,45,123;

say 0+@a;             # 5
Dump $a[0];           # NOK (floating point format)
say $Config{nvsize};  # 8 byte floats on this build

答案 1 :(得分:3)

很抱歉,但你误解了霍布斯对你之前问题的回答。

$unparray[0] 双精度浮点值;但是length不像(比方说)C的sizeof运算符,并没有告诉你它的参数大小。相反,它将其参数转换为字符串,然后告诉您该字符串的长度。

例如,这个:

my $a = 3.0 / 1.5;
print length($a), "\n";

将打印出来:

1

因为它将$a设置为2.0,其字符串化为2,其长度为1