8

読んでいるバイナリファイルがあり、2バイトの値が「逆」のバイト順序(リトルエンディアン?)で格納されています。

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

これらの値を作成した元のプログラムは、それらをshortとして内部的に保存します。これらの値は、29、19、39、59、69、49、79に対応している必要があります。Python2.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コードでそれらを再アセンブルするのに行き詰まっていますか?

4

3 に答える 3

9

バイト順は、書式文字列の先頭にある 1 文字で指定されます。

values = struct.unpack('!7h', data)
于 2011-11-02T16:23:33.167 に答える
4

どうですか

>>> 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)?

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

于 2011-11-02T16:45:05.353 に答える
1

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

于 2012-12-13T21:02:34.307 に答える