gpt4 book ai didi

perl - 如何在 64 位 Perl 中解压缩(64 位)无符号长整数?

转载 作者:行者123 更新时间:2023-12-01 13:01:45 25 4
gpt4 key购买 nike

我正在尝试解压缩通过 SysV::IPC 从 C 程序传递到 Perl 脚本的无符号长值。

已知该值是正确的(我做了一个测试,将相同的值发送到两个队列中,一个由 Perl 读取,第二个由 C 应用程序读取),并且所有前面的值都被正确读取(使用 q 而不是 i! 工作64 位整数)。

还知道 PHP 在 bug 中有 something similar(搜索“unsigned long on 64 bit machines”)(似乎类似:
Pack / unpack a 64-bit int on 64-bit architecture in PHP)

到目前为止测试的参数:

  • ..Q(=某个值大于预期)
  • ..L (= 0)
  • ..L! (=大值)
  • ..l (= 0)
  • ..l! (=大值)
  • ..lN! (=0)
  • ..N,..N! (=0)
  • use bigint; use bignum; -- 没有效果。

    细节:
  • sizeof(unsigned long) = 8;
  • Data::Dumper->new([$thatstring])->Useqq(1)->Dump(); 很多空字节沿着一些有意义的..
  • 字节序='12345678';

  • 解决方案:
    - x4Q 填充四个字节。

    最佳答案

    使用 Q 解包在 the template如果你有 64 位 Perl,开箱即用:

    The TEMPLATE is a sequence of characters that give the order
    and type of values, as follows:

    ...

    q A signed quad (64-bit) value.
    Q An unsigned quad value.
    (Quads are available only if your system supports 64-bit
    integer values _and_ if Perl has been compiled to support those.
    Causes a fatal error otherwise.)

    要获得更强大的解决方案,请将值解压缩为 8 字节字符串并使用 Math::Int64 模块将其转换为整数:
    use Math::Int64 qw( :native_if_available int64 );

    ...

    $string_value = unpack("A8", $longint_from_the_C_program);

    # one of these two functions will work, depending on your system's endian-ness
    $int_value = Math::Int64::native_to_int64($string_value);
    $int_value = Math::Int64::net_to_int64($string_value);

    关于perl - 如何在 64 位 Perl 中解压缩(64 位)无符号长整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5488551/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com