我想将一些二进制图像数据编码/压缩为位序列。 (一般来说,这个序列的长度不会完全适合所有标准整数类型。)
如何在不浪费空间的情况下做到这一点? (我意识到,除非位序列具有“不错”的长度,否则在最后总是必须有少量 [< 1 字节] 的剩余空间。)
FWIW,我估计每个要编码的符号最多需要 3 位。 Python 是否有用于此类工作的任何内置工具?
最佳答案
没有内置非常方便的东西,但有第三方模块,如bitstring和 bitarray这是为此而设计的。
from bitstring import BitArray
s = BitArray('0b11011')
s += '0b100'
s += 'uint:5=9'
s += [0, 1, 1, 0, 1]
...
s.tobytes()
要将 3 位数字序列(即范围 0->7)连接在一起,您可以使用
>>> symbols = [0, 4, 5, 3, 1, 1, 7, 6, 5, 2, 6, 2]
>>> BitArray().join(BitArray(uint=x, length=3) for x in symbols)
BitArray('0x12b27eab2')
>>> _.tobytes()
'\x12\xb2~\xab '
一些相关问题:
关于python - 如何在 Python 中打包任意位序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5066119/