我目前正在用python编写一个程序,该程序使用霍夫曼编码压缩文件。因为python,我一直在尝试在如此低的级别上编程时遇到问题。我无法解决的一个问题是解码(我将正在读取的文件编码在.bin文件中(,因为到目前为止,我发现的所有内容都是逐字节或十六进制读取二进制文件,所以我无法实现解压缩。
所以我的问题是,我可以一点一点地读取python中的二进制文件吗,比如有一个变量:binary_text='0b1000101000…'
您也可以使用bitstream
库。它允许将字节表示为二进制流:
>>> from bitstream import BitStream
>>> BitStream(b"Hello World!")
010010000110010101101100011011000110111100100000010101110110111101110010011011000110010000100001
您可以通过read
和write
功能读取和写入位,如:
>>> stream = BitStream() # <empty>
>>> stream.write(True, bool) # 1
>>> stream.write(False, bool) # 10
>>> stream.read(bool, 2) # <empty>
[True, False]
您可以在这里找到文档和更多示例。
更新:
另一个很好的替代方案是比特数组库,它用C语言实现,并提供了丰富的操作比特流的功能。
您应该能够以rb
(读取二进制(模式打开文件,然后在文件句柄上使用.read
。以下是python的read
的相关文档:https://docs.python.org/3/library/functions.html#open
with open('my_file.txt', 'rb') as f:
eight_bytes = f.read(8)
>>> print(eight_bytes)
b'hello wo'
>>> eight_bytes[0]
104
不知道为什么"0b"
会有用,但无论如何:
import numpy as np
bin = np.fromfile("file.bin", 'u1')
binary_text = "0b"
for byte in bin:
for mask in [128, 64, 32, 16, 8, 4, 2, 1]:
binary_text += '1' if byte & mask else '0'
print(binary_text)