如何在Python中打包任意位序列?


问题内容

我想将一些二进制图像数据编码/压缩为序列(如果有位)。(通常,此序列的长度不能完全适合所有标准整数类型。)

我如何做到这一点而又不浪费空间?(我意识到,除非位序列的长度为“ nice”,否则在最后一刻始终必须有少量[<1个字节]的剩余空间。)

FWIW,我估计每个要编码的符号最多需要3位。Python是否有用于此类工作的内置工具?


问题答案:

内置的东西并不十分方便,但是为此目的设计了第三方模块,例如bitstringbitarray

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 '

一些相关的问题: