从这个问题:
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" '
非常感谢任何答案,
干杯!
答案 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
。