2014-03-06 51 views
2

我對如何從下面描述的文件讀取二進制數據感到困惑。描述如何創建此數據的文檔聲明如下:讀取二進制數據(字節順序)

有一個「開始日誌文件記錄」,並且格式是明文消息以ctrl-Z'0x1a'結尾(結束DOS/Windows文件),ctrl-D'0x04'(Unix的文件結束)和空'0x00'(按照設計文檔的順序)。

然後,有值0×12345678(4個字節長,以允許任意的解碼器來確定字節存儲順序)

之後住數據的肉。

我的代碼來讀取這個文件:

f = open(filename, 'rb') 
while True: 
    byte = f.read(1) 
    if byte.encode('hex') == '1a':   # ctrl-z 
     if s[i+1].encode('hex') == '04':  # ctrl-D 
      if s[i+2].encode('hex') == '00': # null 
       print s[i:i+8].encode('hex') 
       break 

打印>>1a04007856341200

正如你所看到的,0x12345678隱藏在那裏。我從我的研究中瞭解到,這意味着數據存儲爲「小端」。現在我的工具(我覺得)讓事情變得比我需要的更困難。例如,下面的代碼挑出年(YYYY)文件的創建

i = year_location_in_file # just a pointer 

created_year = struct.unpack('<cc', s[i:i+2]) 
print 'created_year as hex:', created_year 

created_year = int(''.join([e for e in created_year][::-1]).encode('hex'), 16) 
print 'created year as int:', created_year 

打印:

>> created_year as hex: ('\xdd', '\x07')

>> created year as int: 2013

我花了顯著時間去了解所有的提出的問題和閱讀我可能會Google的一切。我希望答案能夠幫助我以及任何努力瞭解二進制文件中字節順序的人。謝謝你的社區。

編輯:使用print(repr(open(filename, 'rb').read(600)))

....sometext\xd4\xb4\x97\x1a\x04\x00xV4\x12\x00U\x01\.....

- B

+0

不要提前致謝,我想單獨*'?'*更多,要知道要關注什麼。我甚至嘗試過Ctrl + F和*「問題」*。無法找到任何。 – luk32

+0

到底應該代表什麼是二進制的東西?你顯示13個字節(最後有一個額外的反斜槓),但你不會說他們應該如何解釋。 – Blckknght

+0

@Blckknght這是上述印刷聲明的結果。我只是表明,我正在尋找的價值(0x12345678)在那裏作爲xV4 \ x12 \ –

回答

0

我覺得你的麻煩來自使用c爲你的代碼struct.unpack,而不是一個大尺寸類型。 c是一個字符,它只有一個字節長(這意味着字節順序不重要)。相反,使用h爲兩個字節的短整數,或l爲四個字節長的int(如果您需要無符號值,請使用大寫字母)。

year_data = b"\x77\x07"      # bytes sliced from the binary file 
year = struct.unpack("<h", year_data)   # unpacked to int in one go