C プログラムから SysV::IPC 経由で Perl スクリプトに渡される unsigned long 値をアンパックしようとしています。
値が正しいことはわかっており (同じ値を 2 つのキューに送信するテストを行いました。1 つは Perl によって読み取られ、もう 1 つは C アプリケーションによって読み取られます)、先行する値はすべて正しく読み取られます ( 64 で動作するq代わりに使用されます)。 i!-ビット整数)。
PHP にも同様のバグがあったことも知られています (「unsigned long on 64 ビット マシン」を検索してください) (同様のようです: Pack / unpack a 64-bit int on 64-bit architecture in PHP )
これまでにテストされた引数:
- ..Q ( = 予想よりも大きな値)
- ..L ( = 0)
- ..L! ( = 大きな値)
- ..l (= 0)
- ..l! ( = 大きな値)
- ..lN! ( = 0)
- ..ん、..ん!( = 0)
use bigint; use bignum;- 無効。
詳細:
sizeof(unsigned long)= 8;Data::Dumper->new([$thatstring])->Useqq(1)->Dump();意味のあるものに沿って多くのヌルバイト..- byteorder='12345678';
解決策: - x4Q4 バイトのパディングあり。