Python 将二进制文件解释为ASCII
我有一个二进制文件(我用C创建的),我想看看这个文件。显然,我无法“看到”任何有用的东西,因为它是二进制的。然而,我知道它包含一定数量的行,并且数字具有双精度。我正在寻找一个脚本来读取一些值并打印它们,这样我就可以验证它们是否在正确的范围内。换句话说,这就像在linux中对文本文件执行Python 将二进制文件解释为ASCII,python,linux,shell,Python,Linux,Shell,我有一个二进制文件(我用C创建的),我想看看这个文件。显然,我无法“看到”任何有用的东西,因为它是二进制的。然而,我知道它包含一定数量的行,并且数字具有双精度。我正在寻找一个脚本来读取一些值并打印它们,这样我就可以验证它们是否在正确的范围内。换句话说,这就像在linux中对文本文件执行head或tail。 有办法吗? 现在我已经用Python编写了一些东西,但它不能满足我的需要: CHUNKSIZE = 8192 file = open('eigenvalues.bin', 'rb') data
head
或tail
。
有办法吗?
现在我已经用Python编写了一些东西,但它不能满足我的需要:
CHUNKSIZE = 8192
file = open('eigenvalues.bin', 'rb')
data = list(file.read())
print data
可以使用struct.unpack将二进制数据转换为特定的数据类型 例如,如果要从二进制数据中读取第一个double。(未测试,但相信这是正确的)
您可以使用struct.unpack将二进制数据转换为特定的数据类型 例如,如果要从二进制数据中读取第一个double。(未测试,但相信这是正确的) 使用读取同质二进制表示数字:
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()
调用,以在little和big-endian之间切换。用于查看用于读取数据的字节顺序。如果您的数据是在使用little endianess的平台上写入的,如果您的平台使用另一种形式,请交换,反之亦然:
import sys
if sys.byteorder == 'big':
# data was written in little-endian form, so swap the bytes to match
data.byteswap()
使用读取同质二进制表示数字:
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()
调用,以在little和big-endian之间切换。用于查看用于读取数据的字节顺序。如果您的数据是在使用little endianess的平台上写入的,如果您的平台使用另一种形式,请交换,反之亦然:
import sys
if sys.byteorder == 'big':
# data was written in little-endian form, so swap the bytes to match
data.byteswap()
使用此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
,您可以通过此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
Nice-不知道这个功能。谢谢。@Seidr:array
是对struct
的一个很好的补充模块,如果您只处理一种类型的C标准二进制数据序列。nice-不知道这个功能。谢谢。@Seidr:array
是对struct
的一个很好的补充模块,如果您只处理一种类型的C标准二进制数据的序列。@jilliagre确实非常有用!谢谢!@jilliagre确实非常有用!谢谢