python中的逐位操作

问题描述

我目前正在用 python 编写一个程序,该程序使用霍夫曼编码压缩文件。由于python,我一直在尝试在如此低的级别上编程时遇到问题。我无法解决一个问题是解码(我将正在读取的文件编码为 .bin 文件),因为到目前为止我发现的所有内容都是逐字节或以十六进制读取二进制文件,我是无法实现解压。

所以我的问题是,我可以在 python 中一点一点地读取二进制文件,例如有一个变量:binary_text = '0b1000101000...'

解决方法

您也可以使用 bitstream 库。它允许将字节表示为二进制流:

>>> from bitstream import BitStream
>>> BitStream(b"Hello World!")
010010000110010101101100011011000110111100100000010101110110111101110010011011000110010000100001

您可以通过 readwrite 函数读取和写入位,如下所示:


>>> stream = BitStream()        # <empty>
>>> stream.write(True,bool)    # 1
>>> stream.write(False,bool)   # 10
>>> stream.read(bool,2)        # <empty>
[True,False]

您可以找到here的文档和更多示例。

更新:

另一个不错的替代方案是 bitarray 库,它是用 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)