2011-11-02 37 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 

如何使用正確的字節順序解壓縮這些值?我堅持閱讀兩個字節分開然後重新組裝它們在Python代碼?

回答

9

字節順序是用格式字符串開頭的單個字符指定的。

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

啊哈,就是這樣。我在格式字符串中有幾個格式說明符,但只將字節順序char放在'h'說明符的前面,而不是放在整個字符串的開頭。謝謝! – 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文檔,它看起來像你需要使用<來指定little-endian。

0

我已經通過使用a.byteswap(True)解決了顛倒字節順序的類似問題,但我不確定這是否是最有效的方法。

相關問題