2011-11-02 4 views
8

私はバイナリファイルを持っていますが、ここでは2バイトの値が 'リバース'バイト順(リトルエンディアン?バイナリデータのバイト順を切り替える方法

1D 00 13 00 27 00 3B 00 45 00 31 00 4F 

これらの値を作成した元のプログラムは、内部的にショートとしてそれらを保存します。これらの値は、29,19,39,59,69,49,79に対応する必要があります。私はPython 2.6.5を使ってこれらの値を読み込もうとしています(これはおそらく古いシステムで実行されています(2.3や2.4など) 。

私は

val1, val2, val3, val4, val5, val6, val7 = struct.unpack("1h 1h 1h 1h 1h 1h 1h", data) 

を使用して試してみたと、当然のことながら、値がすべて間違って出てくる:

7427 
4864 
9984 
15104 
17664 
12544 
20224 

を構造体の説明を見た後、私は私ができるようにしようと思いました

val1, ... = struct.unpack("!h !h ... 

が、のようなものを使用するには、テスト、私は

を得たとき
struct.error: bad char in struct format 

これらの値を正しいバイト順序でアンパックするにはどうすればよいですか?私は別々に2バイトの読み込みをしてから、Pythonコードでそれらを再アセンブルしていますか?

答えて

9

バイト順序は、書式文字列の先頭に1文字で指定します。

values = struct.unpack('!7h', data) 
+0

ああ、そうだった。書式指定文字列にはいくつかの書式指定子がありますが、文字列全体の先頭ではなく、「h」指定子の前にバイト順charが配置されています。ありがとう! – pfyon

3

どの程度

>>> a='\x1d\x00\x13\x00\x27\x00\x3b\x00\x45\x00\x31\x00\x4f\x00'

>>> struct.unpack('<%dH' % (len(a)/2), a)

(29, 19, 39, 59, 69, 49, 79)

structのドキュメントによると、リトルエンディアンを指定するには<を使用する必要があるようです。

0

私はa.byteswap(True)を使用して逆のバイト順序の同様の問題を解決しましたが、これが最も効率的な方法であるかどうかはわかりません。

関連する問題