将二进制文件解释为ASCII

时间:2013-05-10 10:52:58

标签: python linux shell

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

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

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分: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查看用于读取数据的字节顺序。如果您的数据是使用little-endianess在平台上编写的,请在您的平台使用其他表单时进行交换,反之亦然:

import sys

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

答案 2 :(得分: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标记,我假设您使用的是ddod的Gnu版本。