2013-05-10 157 views
1

我有一個二進制文件(我用C創建的),我希望看看文件。顯然,我不能「看到」任何有用的東西,因爲它是二進制的。不過,我知道它包含一定數量的行,其中包含雙精度數字。我正在尋找一個腳本來讀取一些值並打印它們,以便我可以驗證它們是否在正確的範圍內。換句話說,它就像在文本文件中的linux中執行headtail。 有沒有辦法呢? 現在我已經得到了在Python的東西,但它不會做我想做的:將二進制文件解釋爲ASCII

CHUNKSIZE = 8192 
file = open('eigenvalues.bin', 'rb') 
data = list(file.read()) 
print data 

回答

3

使用array module閱讀同質二進制表示的數字:

from array import array 

data = array('d') 
CHUNKSIZE = 8192 
rowcount = CHUNKSIZE/data.itemsize # number of doubles we find in CHUNKSIZE bytes 

with open('eigenvalues.bin', 'rb') as eg: 
    data.fromfile(eg, rowcount) 

array.array類型其他行爲就像一個列表,只有它可以容納的值的類型被收縮(在這種情況下爲float)。

根據輸入數據,您可能需要在讀取後添加data.byteswap()調用以在小字節和大字節之間切換。使用sys.byteorder來查看使用什麼字節順序來讀取數據。

import sys 

if sys.byteorder == 'big': 
    # data was written in little-endian form, so swap the bytes to match 
    data.byteswap() 
+0

不錯 - 不知道這個功能。謝謝。 – Seidr 2013-05-10 11:00:45

+0

@Seidr:如果你正在處理一個只有一種類型的C標準二進制數據的序列,'array'是'struct'的一個很好的補充模塊。 – 2013-05-10 11:03:00

3

您可以使用struct.unpack將二進制數據轉換爲特定的數據類型。

例如,如果您想從二進制數據中讀取第一個double。 (未測試,但相信這是正確的)

struct.unpack("d",inputData[0:7]) 

http://docs.python.org/2/library/struct.html

3

你可以看到在無符號的十進制表示文件的每個字節這個shell命令:如果你的數據是使用小字節序,互換,如果你的平臺使用其他形式,反之亦然寫在一個平臺上:

od -t u1 eigenvalues.bin | less 

你想看到一個特定區域,並進行解碼浮點數,你可以使用dd提取它們並od -F選項來解碼,如:

dd status=noxfer if=eigenvalues.bin bs=1 skip=800 count=16 | od -F 

將在二進制文件中顯示存儲在偏移量800和808處的兩個雙精度數字。

請注意,根據針對您的問題設置的Linux標記,我假設您使用的是Gnu版本ddod

+0

@ jilliagre確實非常有用!謝謝! – Manolete 2013-05-10 13:09:42