【发布时间】:2011-03-30 15:35:01
【问题描述】:
我正在尝试解压缩通过 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();很多空字节沿着一些有意义的.. - byteorder='12345678';
解决方案:
- x4Q 填充四个字节。
【问题讨论】:
-
在您的打包字符串上显示
Data::Dumper->new($string)->Useqq(1)->Dump的输出以及您期望的数字。也许 perl -V:byteorder 的输出 -
对不起,我的意思是
print Data::Dumper...的输出 -
@ysth, VAR1 = "\210\23\0\0\0\0\0\0\210\23\0\0\0\0\0\0\177\0 \0\1\0\0\0\0\177\0\0\1\0\0\0\0W\273\@\37\0\0\0\0}^\330u\0\0 \0\0\264\13\340u\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 \16T\223M\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - 哇,太多的\0,检查。也许
my $string声明不适合某处的返回类型。 -
您是否尝试过解压缩脚本中编码的标量常量?一旦你开始工作,试试管道......
-
@drewk,不,我只是可以同时运行所有三个程序,(Perl 版本目前不起作用,除非我能摆脱这个解包问题)并且它可以快速重新启动.. 不是时候单元测试:)