高效地将压缩值写入流
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)
}
目前,我正在尝试从现有的 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)
}