我正在打开一个像这样的二进制文件:
file = open("test/test.x", 'rb')
并读入列表中的行。每一行看起来都像:
'\xbe\x00\xc8d\xf8d\x08\xe4.\x07~\x03\x9e\x07\xbe\x03\xde\x07\xfe\n'
我很难操纵这些数据。如果我尝试打印每一行,python冻结,并发出哔哔声(我认为那里有一个二进制哔声代码)。如何安全地使用这些数据?如何将每个十六进制数转换为十进制数?
答案 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字符的数据,这将无效。
您可以安全地使用数据的任何字节。如果要将其打印为十六进制,请查看函数ord
和hex
/
答案 5 :(得分:1)