Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将二进制文件解释为ASCII_Python_Linux_Shell - Fatal编程技术网

Python 将二进制文件解释为ASCII

Python 将二进制文件解释为ASCII,python,linux,shell,Python,Linux,Shell,我有一个二进制文件(我用C创建的),我想看看这个文件。显然,我无法“看到”任何有用的东西,因为它是二进制的。然而,我知道它包含一定数量的行,并且数字具有双精度。我正在寻找一个脚本来读取一些值并打印它们,这样我就可以验证它们是否在正确的范围内。换句话说,这就像在linux中对文本文件执行head或tail。 有办法吗? 现在我已经用Python编写了一些东西,但它不能满足我的需要: CHUNKSIZE = 8192 file = open('eigenvalues.bin', 'rb') data

我有一个二进制文件(我用C创建的),我想看看这个文件。显然,我无法“看到”任何有用的东西,因为它是二进制的。然而,我知道它包含一定数量的行,并且数字具有双精度。我正在寻找一个脚本来读取一些值并打印它们,这样我就可以验证它们是否在正确的范围内。换句话说,这就像在linux中对文本文件执行
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确实非常有用!谢谢