【问题标题】:How do I unpack a double-precision value in Perl?如何在 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" '

非常感谢您的任何回答,
干杯!

【问题讨论】:

    标签: perl bytearray unpack


    【解决方案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 $Config{nvsize};  # 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 版本。它具有执行此操作的功能。
    猜你喜欢
    • 1970-01-01
    • 2011-08-06
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多