2010-06-17 99 views
15

二進制數據,我打開了一個二進制文件,像這樣:操縱在Python

file = open("test/test.x", 'rb') 

和線列表中讀取。每條線看起來有點像:

'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n' 

我很難操縱這些數據。如果我嘗試打印每一行,python會凍結,併發出嗶嗶聲(我認爲在那裏有一個二進制嗶聲代碼)。我如何安全地使用這些數據?我怎樣才能將每個十六進制數轉換爲十進制?

回答

23

要打印它,你可以做這樣的事情:

print repr(data) 

對於整個事情的十六進制:

print data.encode('hex') 

對於每個字節的十進制值:

print ' '.join([str(ord(a)) for a in data]) 

要從數據中解壓縮二進制整數等,就好像它們最初來自C型結構一樣,請查看struct模塊。

+0

謝謝!這就是我一直在尋找的! – 2010-06-17 06:26:09

1

您正在嘗試打印轉換爲ASCII字符的數據,這不起作用。

您可以安全地使用任何數據字節。如果你想打印爲十六進制,看看功能ordhex/

2

就像上面提到的theatrus一樣,ord和hex可能會幫助你。 如果您想嘗試解釋文件中的某種結構化二進制數據,struct模塊可能會有所幫助。

+2

+1結構。正確的方式去解釋打包的二進制數據。 – 2010-06-17 06:27:35

3

\xhh is the character with hex value hh。其他字符,如.和`〜'是普通字符。

對一個字符串進行迭代可以爲其提供一個字符。

ord(c) will return an integer representing the character.例如,ord('A') == 65

這將打印十進制數的每個字符:

s = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n' 
print ' '.join(str(ord(c)) for c in s) 
+2

請注意,\ x07是ASCII BEL字符。這是什麼導致了嗶嗶聲。 – dan04 2010-06-17 06:29:44

1

您是否使用read()readline()?您應該使用read(n)來讀取n個字節; readline()將會一直讀取,直到達到二進制文件可能沒有的換行符爲止。

不管是哪種情況,您都會返回一串字節,這可能是可打印或不可打印的字符,並且可能不是很有用。

你想要的是ord(),它將一個字節的字符串轉換爲相應的整數值。 read()從一次一個字節的文件中調用ord()或者遍歷整個字符串。

2

二進制數據很少被劃分爲由'\ n'分隔的「行」。如果是,它將有一個隱式或顯式的轉義機制來區分'\ n'作爲行終止符和'\ n'作爲數據的一部分。在沒有逃脫機制的知識的情況下盲目讀取這樣的文件是毫無意義的。

要回答你的具體問題:

「\ X07」是ASCII BEL字符,這原本是用於振鈴的電傳打字機上的鈴鐺。

通過做ord(b)可以得到一個字節'b'的整數值。

但是,要正確處理二進制數據,您需要知道佈局是什麼。你可以使用有符號和無符號整數(大小爲1,2,4,8字節),浮點數,不同長度的小數,固定長度的字符串,可變長度的字符串等等。增加的複雜性來自於數據是否被記錄在bigendian時尚或littleendian時尚。一旦你知道了上述所有信息(或者有非常好的猜測信息),Python struct module應該可以用於所有或大部分處理; ctypes module也可能有用。

數據格式是否有名字?如果是這樣,告訴我們;我們可能會將您指向代碼或文檔。

你問「我該如何去安全使用這些數據?」這引出了一個問題:你想用它來做什麼?你想做什麼操作?