1

我有一个二进制文件(我用 C 语言创建的),我想看看文件内部。显然,我将无法“看到”任何有用的东西,因为它是二进制的。但是我知道它包含一定数量的双精度数字行。我正在寻找一个脚本来读取一些值并打印它们,以便我可以验证它们是否在正确的范围内。换句话说,它就像在 linux 上做headtail在一个文本文件上。有没有办法做到这一点?现在我在 Python 中有一些东西,但它没有做我想要的:

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

3 回答 3

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

于 2013-05-10T11:29:02.920 回答
3

您可以使用 struct.unpack 将二进制数据转换为特定的数据类型。

例如,如果您想从二进制数据中读取第一个 double。(未经测试,但相信这是正确的)

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

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

于 2013-05-10T10:55:42.907 回答
3

使用该array模块读取同质二进制表示数字:

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查看用于读取数据的字节顺序。如果您的数据是在使用 little-endianess 的平台上写入的,则交换您的平台是否使用其他形式,反之亦然:

import sys

if sys.byteorder == 'big':
    # data was written in little-endian form, so swap the bytes to match
    data.byteswap()
于 2013-05-10T10:59:34.803 回答