2013-05-10 156 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