在Python中操作二进制数据

时间:2010-06-17 06:12:42

标签: 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冻结,并发出哔哔声(我认为那里有一个二进制哔声代码)。如何安全地使用这些数据?如何将每个十六进制数转换为十进制数?

6 个答案:

答案 0 :(得分:24)

要打印它,你可以这样做:

print repr(data)

以整个十六进制:

print data.encode('hex')

对于每个字节的十进制值:

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

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

答案 1 :(得分:4)

\xhh is the character with hex value hh。其他字符如.和“〜”是普通字符。

对字符串进行迭代会在其中为您提供一个字符,一次一个。

ord(c) will return an integer representing the character.例如,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)

答案 2 :(得分:2)

就像提到的theatrus一样,ord和hex可能对你有帮助。 如果您想尝试解释文件中的某种结构化二进制数据,struct模块可能会有所帮助。

答案 3 :(得分:2)

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

回答您的具体问题:

'\ x07'是ASCII BEL字符,最初用于在电传打字机上振铃。

您可以通过执行ord(b)来获取字节'b'的整数值。

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

数据格式是否有名称?如果是,请告诉我们;我们或许可以为您指出代码或文档。

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

答案 4 :(得分:1)

您正在尝试打印转换为ASCII字符的数据,这将无效。

您可以安全地使用数据的任何字节。如果要将其打印为十六进制,请查看函数ordhex /

答案 5 :(得分:1)