python 中的逐位操作
Bit by Bit manipulation in python
我目前正在 python 中编写一个程序,该程序使用霍夫曼编码压缩文件。由于 python,我在尝试在如此低的级别上进行编程时遇到了问题。我无法解决的一个问题是解码(我将正在读取的文件编码为 .bin 文件),因为到目前为止我发现的所有内容都是逐字节或十六进制读取二进制文件,我是无法解压
所以我的问题是,我可以一点一点地读取 python 中的二进制文件,例如有一个变量:binary_text = '0b1000101000...'
您应该能够以 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
您也可以使用 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]
您可以找到文档和更多示例 here。
更新:
另一个不错的选择是 bitarray 库,它用 C 实现并提供丰富的操作比特流的功能。
不知道为什么 "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)
我目前正在 python 中编写一个程序,该程序使用霍夫曼编码压缩文件。由于 python,我在尝试在如此低的级别上进行编程时遇到了问题。我无法解决的一个问题是解码(我将正在读取的文件编码为 .bin 文件),因为到目前为止我发现的所有内容都是逐字节或十六进制读取二进制文件,我是无法解压
所以我的问题是,我可以一点一点地读取 python 中的二进制文件,例如有一个变量:binary_text = '0b1000101000...'
您应该能够以 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
您也可以使用 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]
您可以找到文档和更多示例 here。
更新:
另一个不错的选择是 bitarray 库,它用 C 实现并提供丰富的操作比特流的功能。
不知道为什么 "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)