高效地将压缩值写入流

Efficiently write compressed values to stream

目前,我正在尝试从现有的 C 代码中翻译一些压缩算法。

编码和解码对我来说并不难。它更多的是关于流(无论是文件还是套接字)的序列化。

输入为12位,压缩输出为7位。但是向流中写入内容总是需要写入整个 8 位。

因为每个值总是剩余 1 位,这是否意味着我必须缓冲 7 个字节才能写入 8 个值?这将给出以下字节(所有 1 都属于第一个值,所有 2 都属于第二个值,等等)

11111112
22222233
33333444
44445555
55566666
66777777
78888888

真正的编解码器或使用的语言都不重要(实际上:编解码器是 G.711,语言是 Golang)。所以也许 go-标签不合适。

有什么线索吗?

使用二进制移位运算符一次将七位加载到位缓冲区中,只要位缓冲区有八位,就输出它。最后,如果还有剩余的位,则输出缓冲区中的最后一个字节。

类似(不知道 Go,但这应该很接近):

bits = 0
bitbuf = 0
... some loop ...
    ...make your seven bits ...
    bitbuf |= sevenbits << bits
    bits += 7
    if bits >= 8 {
        output(bitbuf & 0xff)
        bitbuf >>= 8;
        bits -= 8;
    }
...
if bits > 0 {
    output(bitbuf)
}