如何以字节表示 LZW 输出?

How do I represent an LZW output in bytes?

我找到了 LZW 算法的实现,我想知道如何将其输出(一个 int 列表)表示为字节数组。

我曾尝试使用一个字节,但在长输入的情况下,字典有超过 256 个条目,因此我无法转换。

然后我尝试添加一个额外的字节来指示用于存储值的字节数,但在这种情况下我必须为每个值使用 2 个字节,这压缩不够。

我该如何优化它?

在他 1984 年关于 LZW 的文章中,T.A。韦尔奇实际上并没有说明如何 "encode codes",而是描述了映射 "strings of input characters into fixed-length codes",继续 "use of 12-bit codes is common"。 (允许三个八位字节和两个代码之间的双射映射。)
BSD compress(1) command 并没有字面意思,而是引入了 header,有趣的部分是 maximum 数字的规范,如果位用于编码 LZW 输出代码,允许解压缩器适当调整解压缩表的大小,或者以可控的方式尽早失败。 (但对于第一个,)代码只用必要的整数位数编码,从 9 开始。
另一种方法是使用 Arithmetic Coding,尤其是 ,如果使用的模型不同于 每个代码都是同样可能的

作为位,而不是字节。您只需要一个简单的例程,将任意数量的位写入字节流。它只是保留一个 one-byte 缓冲区,您可以在其中放入位,直到有八位为止。然后写入比字节,清除缓冲区,并重新开始。另一边是相反的过程。

当你到达终点时,如果不为空,则只写入最后一个字节缓冲区,并将其余位设置为零。

你只需要算出在当前压缩状态下每个符号需要多少位就可以了。从流中提取位时,可以在另一侧做出相同的决定。