如何在Python中读取文件的二进制数据

2 投票
5 回答
6017 浏览
提问于 2025-04-17 03:43

在Python中,当我用'rb'模式读取一个可执行文件时,我本来想得到一些二进制值,比如0010001之类的,但结果却得到了一堆我看不懂的字母和符号。

Ex: ???}????l?S??????V?d?\?hG???8?O=(A).e??????B??$????????:    ???Z?C'???|lP@.\P?!??9KRI??{F?AB???5!qtWI??8???!ᢉ?]?zъeF?̀z??/?n??

我该如何在Python中访问一个文件的二进制数字呢?

如果有任何建议或帮助,我将非常感激。提前谢谢你们。

5 个回答

3

字符串中的每个字符都是一个二进制字节的ASCII表示。如果你想把它变成由零和一组成的字符串,可以把每个字节转换成整数,然后格式化成8位的二进制数字,最后把它们连接在一起:

>>> s = "hello world"
>>> ''.join("{0:08b}".format(ord(x)) for x in s)
'0110100001100101011011000110110001101111001000000111011101101111011100100110110001100100'

如果你真的需要在二进制层面上分析或处理数据,使用一个外部模块,比如bitstring,可能会很有帮助。可以查看一下文档;如果只是想获取二进制表示,可以使用类似下面的代码:

>>> f = open('somefile', 'rb')
>>> b = bitstring.Bits(f)
>>> b.bin
0100100101001001...
4

在Python中,字节序列是用字符串来表示的。当你打印出一个字节序列时,看到的一串字母和符号其实只是这些字节的可打印表示。为了更好地利用这些数据,通常需要对它进行一些处理,以获得更有用的表现形式。

你可以使用 ord(x)bin(x) 来获取十进制和二进制的表示:

>>> f = open('/tmp/IMG_5982.JPG', 'rb')
>>> data = f.read(10)
>>> data
'\x00\x00II*\x00\x08\x00\x00\x00'

>>> data[2]
'I'

>>> ord(data[2])
73

>>> hex(ord(data[2]))
'0x49'

>>> bin(ord(data[2]))
'0b1001001'

>>> f.close()

你在调用 open() 时加上的 'b' 标志,并不会告诉Python如何表示文件的内容。根据文档

在需要区分二进制文件和文本文件的系统中,向模式中添加 'b' 可以以二进制模式打开文件;而在不区分这两者的系统中,添加 'b' 是没有效果的。

除非你只是想看看文件中的二进制数据是什么样的,Mark Pilgrim的书《Dive Into Python》中有一个关于如何处理二进制文件格式的例子。这个例子展示了如何从MP3文件中读取IDv1标签。书的网站似乎无法访问,所以我提供了一个镜像链接。

6

这就是二进制。它们以字节的形式存储,当你打印出来时,它们会被解释成ASCII字符。

你可以使用 bin() 函数ord() 函数 来查看实际的二进制代码。

for value in enumerate(data):
   print bin(ord(value))

撰写回答