2012-01-08 5 views
3

私はバイナリファイルを持っており、内容を取得するために "unpack"関数を使用しています。unpack関数が類似の結果を出さない

私のスクリプトは、32ビットexeまたは64ビットexeの両方で実行できます。したがって、私は次のコードを使用している:

if ($ENV{PROCESSOR_ARCHITECTURE} eq 'x86') 
{ 
    @data = unpack("LL8", $binary); 
} 
else 
{ 
    @data = unpack("Q8", $binary); 
} 
    print Dumper \@data; 

をしかし、私は32ビットのActive Perlと64ビットのActive Perlのコンパイラを使用して同じことを実行していたとき、私は取得しています異なる結果:

32bit版:

$ VAR1 = [ 129864071、 0、 47193587、 0、 16448777、 0、 41067198、 0,];

64ビット:

$ VAR1 = [ 129864071、 47193587、 16448777、 41067198、 129、 365173507、 25208052、]

この違いの原因は何でしょうか? 32ビットの符号なしロングと64ビットの符号なしクォード値を使用しながら、それらを似たようにするにはどうすればよいですか?

+0

私がここで作った不注意な間違いを見つけました--- @data = unpack( "(LL)8"、$ binary); それから私は32ビットを使って64ビットと解釈します。 – Kallol

+0

はい、カッコで囲まれた '(LL)8 '指定を使用できます。 –

答えて

6

LL8の仕様は、 'unpack 9 unsigned 32-bit quantity'を意味します。

Q8の仕様は、「8個の符号なし64ビット数をアンパックする」ことを意味します。

異なる結果を求めているので、結果が異なることは驚くことではありません。

512ビットのデータをアンパックする場合は、L16(または(LL)8、最終結果は同じですが)を使用することができます。

関連する問題