如何在 Perl 中解压缩双精度值?
Posted
技术标签:
【中文标题】如何在 Perl 中解压缩双精度值?【英文标题】:How do I unpack a double-precision value in Perl? 【发布时间】:2011-11-30 04:02:17 【问题描述】:从这个问题:
bytearray - Perl pack/unpack and length of binary string - Stack Overflow
我了解到,下面 sn-p 中的 @unparray = unpack("d "x5, $aa);
会导致 unparray
中的字符串项 - 而不是双精度数字(如我所料)。
是否有可能从下面sn-p 中的$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" '
非常感谢您的任何回答, 干杯!
【问题讨论】:
【参考方案1】:是什么让您认为它没有被存储为双精度数?
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 $Confignvsize; # 8 byte floats on this build
【讨论】:
非常感谢@ikegami 的这个 sn-p - 所以现在我知道如何检查存储的数据类型(不知道Dump
).. 干杯!【参考方案2】:
抱歉,您误解了霍布斯对您之前问题的回答。
$unparray[0]
是双精度浮点值;但是length
不像(比如说)C 的sizeof
运算符,并且不会告诉你它的参数的大小。相反,它将其参数转换为字符串,然后告诉您该字符串的长度。
例如,这个:
my $a = 3.0 / 1.5;
print length($a), "\n";
将打印这个:
1
因为它将$a
设置为2.0
,它被字符串化为2
,其长度为1
。
【讨论】:
确实,length
就像 C 的 strlen
(但更聪明,因为如果你不传递字符串,它会将参数转换为字符串)。
@ikegami:确实!更聪明的是它不会被包含'\0'
的字符串所愚弄,并且如果参数已经准备好其字符串化版本,则需要 O(1) 时间。 . .但现在我觉得自己像个电视广告。 “但这还不是全部,伙计们。如果您现在调用,length
还将处理 Unicode 字符串,无需额外费用!”
@rukah, length
实际上对 Unicode 一无所知。它只是返回字符串中的字符数。这些字符可能是字节、Unicode 代码点、温度采样等等。它实际上并不适合 Unicode,因为它既不返回字素簇的数量,也不返回字符串的视觉宽度。
@ikegami:嗯,是的,但是如果它是一串 Unicode 字符,那么 length
返回字符数(代码点),这通常是“足够好”。 (但字素簇的数量会rock!)如果你尝试在 UTF-16 或 UTF-32 字符串上使用 C 的 strlen
,它会被空字节愚弄,如果你尝试在 UTF-8 字符串上使用 C 的 strlen
,它会被非 ASCII 字符的多字节表示所迷惑。
有人谈论将Unicode::GCString 添加到 Perl 版本。它具有执行此操作的功能。以上是关于如何在 Perl 中解压缩双精度值?的主要内容,如果未能解决你的问题,请参考以下文章