2013-06-25 30 views
0

我是python的新手,並試圖在發佈前尋求幫助。Python - 搜索十六進制值標記並提取數據

我有二進制文件,其中包含我需要解析的值的數量。每個值都有一個由兩個字節組成的十六進制頭,第三個字節給出該記錄中要解析的數據大小。以下是一個例子:

\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00 

\x76\x12是記錄標記和\x0A接下來要被讀取的字節數。

該數據總是有兩個字節的標記和第三個字節的大小。然而,要解析的數據是可變的,並且記錄標記遞增如下:\x76\x12\x77\x12等等,直到\x79\x12,其中再次開始。

這僅僅是使用此貼子的示例數據。

很多感謝任何幫助或指針。

+0

十六進制值是否總是用反斜槓分隔? – Ampt

+0

這是真正的字符串內容還是它的Python表示? – glglgl

回答

1

是這樣的東西你想要什麼?

>>> b = b'\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00' 
>>> from StringIO import StringIO 
>>> io = StringIO(b) 
>>> io.seek(0) 
>>> io.read(2) #read 2 bytes, maybe validate? 
'v\x12' 
>>> import struct 
>>> nbytes = struct.unpack('B',io.read(1)) 
>>> print nbytes 
(10,) 
>>> data = io.read(nbytes[0]) 
>>> data 
'\x08\x00\x00\x00\x00\x00\x00\x00\x00' 
+2

就我個人而言,我只是使用'nbytes = ord(io.read(1))'而不是在這裏使用'struct'模塊。 – Aya

0

這將把數據作爲原始字符串(以忽略 '\' 轉義字符和分裂成一個列表

a = r"\x76\x12\x0A\x08\x00\x00\x00\x00\x00\x00\x00\x00".split('\\') 
print a 

輸出:[ '', 'X76', 'X12', 'x0','x08','x00','x00','x00','x00','x00','x00','x00','x00']

然後,您感興趣的值,並在需要時將其轉換爲十進制:

for i in range(len(a[4:])): # cutting off records before index 4 here 
    print int(str(a[i+4][1:]),16)