我正在编写一个通用的LZW解码器c ++程序,但在查找有关所用代码字的长度(以位为单位)的文档时遇到了麻烦。我发现有些文章说代码字长12位,而另一些文章说16位长,而另一些文章则说使用可变位长。那是什么呢?对我来说有意义的是,位长是可变的,因为这将提供最佳的压缩率(即最初从9位开始,然后在必要时移至10,然后移至11等...)。但是我找不到有关行业标准的任何“官方”文档。

例如,如果我要打开Microsoft Paint并创建一个简单的100x100pixel全黑图像并将其另存为Tiff。使用LZW压缩将图像保存在Tiff中。因此,在这种情况下,当我解析LZW码字时,应该为第一个码字读9位,12位还是16位?我怎么知道该使用哪一个?

感谢您的任何帮助,您可以提供。

最佳答案

LZW可以通过以下任何一种方式完成。到目前为止,最常见的(至少以我的经验)是从9位代码开始的,然后当字典变满时,移至10位代码,依此类推直到最大大小。

从那里开始,您通常有两种选择。一种是清除字典并重新开始。另一个是继续使用当前词典,而不添加新条目。在后一种情况下,通常会跟踪压缩率,如果压缩率下降得太远,则清除字典并重新开始。

我必须仔细研究一下文档才能确定,但​​是,如果我没有记错的话,TIFF中使用的LZW的具体实现从9开始,直到12位(在设计时,MS-DOS是主要的目标,并且12位代码的字典使用了可用的640K RAM中的大部分)。如果有内存可用,它将在使用最后一个12位代码后立即清除表。

关于c++ - 如何检测LZW解码的码字长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35755758/

10-11 00:50