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

kjo*_*kjo 4 python memory bit-packing

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

如何在不浪费空间的情况下做到这一点?(我意识到,除非比特序列具有"漂亮"的长度,否则在最后总是必须有少量[<1字节]的剩余空间.)

FWIW,我估计,对于我想要编码的每个符号,最多需要3位.Python有这种工作的内置工具吗?

Sco*_*ths 6

没有什么非常方便的内置,但有第三方模块,如bitstringbitarray专为此设计.

from bitstring import BitArray
s = BitArray('0b11011')
s += '0b100'
s += 'uint:5=9'
s += [0, 1, 1, 0, 1]
...
s.tobytes()
Run Code Online (Sandbox Code Playgroud)

要将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 '
Run Code Online (Sandbox Code Playgroud)

一些相关问题: