将二进制文件解释为ASCII
我有一个二进制文件(我用C创建的),我希望看看文件。显然,我不能“看到”任何有用的东西,因为它是二进制的。不过,我知道它包含一定数量的行,其中包含双精度数字。我正在寻找一个脚本来读取一些值并打印它们,以便我可以验证它们是否在正确的范围内。换句话说,它就像在文本文件中的linux中执行head
或tail
。 有没有办法呢? 现在我已经得到了在Python的东西,但它不会做我想做的:将二进制文件解释为ASCII
CHUNKSIZE = 8192
file = open('eigenvalues.bin', 'rb')
data = list(file.read())
print data
使用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()
您可以使用struct.unpack将二进制数据转换为特定的数据类型。
例如,如果您想从二进制数据中读取第一个double。 (未测试,但相信这是正确的)
struct.unpack("d",inputData[0:7])
你可以看到在无符号的十进制表示文件的每个字节这个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版本dd
和od
。
@ jilliagre确实非常有用!谢谢! – Manolete 2013-05-10 13:09:42
不错 - 不知道这个功能。谢谢。 – Seidr 2013-05-10 11:00:45
@Seidr:如果你正在处理一个只有一种类型的C标准二进制数据的序列,'array'是'struct'的一个很好的补充模块。 – 2013-05-10 11:03:00