如何检测LZW解码的码字长度

时间:2016-03-02 18:54:51

标签: c++ decode lzw

我正在编写一般的LZW解码器c ++程序,而且我无法找到所用代码字长度(以位为单位)的文档。我发现的一些文章说代码字长12位,而有些则说16位,而另一些则说使用可变位长。那是哪个呢?对我来说有意义的是,比特长度是可变的,因为这会产生最佳压缩(即最初从9比特开始,然后在必要时移动到10,然后移到11等......)。但是,我无法找到任何"官员"关于行业标准的文件。

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

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

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

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

我必须深入研究文档以确定,但如果我没有弄错,TIFF中使用的LZW的具体实现从9开始,最多可达12位(当它被设计时) ,MS-DOS是主要目标,12位代码字典使用了大部分可用的640K RAM。如果内存服务,它会在最后一个12位代码被使用后立即清除表。