如何在 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 中解压缩双精度值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中解压缩二进制字符串?

Python:如何在 for 中解压缩多个值?

如何在 .NET 中解压缩使用 Lempel-Ziv Haruyasu 算法压缩的字节?

如何在 C# 中解压缩多层 zip 文件

如何在水壶中解压缩和导入 .tar.gz 文件?

如何在 ruby​​ 中解压缩大于 64 位的数字?