在Python中操作二进制数据

在Python中操作二进制数据,python,python-2.7,binary,hex,Python,Python 2.7,Binary,Hex,我正在打开一个二进制文件,如下所示: file = open("test/test.x", 'rb') 并逐行阅读列表。每一行看起来都有点像: '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n' 我很难处理这些数据。如果我尝试打印每一行,python就会冻结,并发出哔哔声(我想在那里的某个地方有一个二进制哔哔声代码)。如何安全地使用这些数据?如何将每个十六进制数转换为十进制数?您试图打印转换为ASCII字符

我正在打开一个二进制文件,如下所示:

file = open("test/test.x", 'rb')
并逐行阅读列表。每一行看起来都有点像:

'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'

我很难处理这些数据。如果我尝试打印每一行,python就会冻结,并发出哔哔声(我想在那里的某个地方有一个二进制哔哔声代码)。如何安全地使用这些数据?如何将每个十六进制数转换为十进制数?

您试图打印转换为ASCII字符的数据,但这不起作用


您可以安全地使用数据的任何字节。如果要将其打印为十六进制,请查看函数
ord
hex
//p>以打印它,您可以执行以下操作:

print repr(data)
就整个事情而言:

print data.encode('hex')
对于每个字节的十进制值:

print ' '.join([str(ord(a)) for a in data])

要从数据中解压二进制整数等,就像它们最初来自C型结构一样,请查看模块。

如theatrus所述,ord和hex可能会帮助您。 如果您想尝试解释文件中的某种结构化二进制数据,该模块可能会有所帮助。

。其他字符,如
和“~”是普通字符

在字符串上进行迭代会给您其中的字符,一次一个

例如,
ord('A')==65

这将打印每个字符的十进制数:

s = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
print ' '.join(str(ord(c)) for c in s)
您使用的是
read()
还是
readline()
?您应该使用
read(n)
读取n个字节
readline()
将一直读取,直到它到达一个新行,而二进制文件可能没有新行

不过,在这两种情况下,都会返回一个字节字符串,它可能是可打印或不可打印的字符,可能不是很有用


您需要的是
ord()
,它将一个单字节字符串转换为相应的整数值
read()
从文件中一次读取一个字节,并对结果调用
ord()
,或迭代整个字符串。

二进制数据很少被划分为以“\n”分隔的“行”。如果是,它将有一个隐式或显式转义机制来区分作为行终止符的“\n”和作为数据一部分的“\n”。在不了解转义机制的情况下,盲目地以行的形式读取这样的文件是毫无意义的

要回答您的具体问题:

“\x07”是ASCII BEL字符,最初用于在电传打字机上敲钟

通过执行
ord(b)
,可以获得字节“b”的整数值

但是,要正确处理二进制数据,您需要知道布局是什么。您可以有有符号和无符号整数(大小为1、2、4、8字节)、浮点数、不同长度的十进制数、固定长度字符串、可变长度字符串等。增加的复杂性来自于数据是以bigendian方式还是以littleendian方式记录。一旦您了解了以上所有内容(或有了非常好的知情猜测),就应该能够用于您的全部或大部分处理;这也可能是有用的

数据格式有名称吗?如果是,请告诉我们;我们可以为您提供代码或文档


你问“我如何安全地使用这些数据?”这就引出了一个问题:你想用它做什么?你想做什么操作?

如果你愿意使用NumPy和,你可以做

>>> from numpy import *
>>> from bitstream import BitStream
>>> raw = '\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
>>> stream = BitStream(raw)
>>> stream.read(raw, uint8, len(stream) // 8)
array([190,   0, 200, 100, 248, 100,   8, 228,  46,   7, 126,   3, 158,
         7, 190,   3, 222,   7, 254,  10], dtype=uint8)

非常感谢。这就是我要找的+1表示结构。解释压缩二进制数据的正确方法。请注意\x07是ASCII BEL字符。这就是引起哔哔声的原因。