我正在编写TIFF解码器。我正在使用的LZW解码器可与所有LZW压缩的GIF和TIFF图像配合使用,但其中一个会使解码代码字符串的缓冲区溢出。我使用com.sun.media.imageioimpl.plugins.tiff包中的TIFFLZWDecompressor对其进行了测试,并抛出以下异常“ java.lang.UnsupportedOperationException:不支持TIFF 5.0样式的LZW代码”。

我一直在尝试找到5.0样式LZW的特殊之处,但没有成功。有人对此有任何想法吗?

注意:从TIFFLZWDecompressor源代码开始,TIFF 5.0样式的LZW压缩的指示符是压缩数据的前两个字节{0x00,0x01}。

最佳答案

TIFF 6.0规范说:


  也可以实现一个LZW版本,其中LZW字符
  深度等于BitsPerSample,如修订版5.0的草案2中所述。但是有一个
  这种方法的主要问题。如果BitsPerSample大于11,则不能
  如果使用最大12位代码,则生成的LZW表太大了。


(TIFF6.pdf,第58-59页)

这可能就是他们所指的。

另一方面...在我自己的读者中,我发现:


  注意:这是违反规范的行为。但是,libTiff会读取此类文件。
  TIFF 6.0规范的第13节:“ LZW压缩” /“算法”,第61页说:
  LZW压缩代码以从高到低的顺序存储在字节中,即FillOrder
  假定为1。将压缩代码写为字节(不是字),以便
  无论是“ II”文件还是“ MM”文件,压缩数据都是相同的。”


关于0x00、0x01的内容实际上是“反向”中的“清除代码”(即遵循字节顺序,而不是按照规范所说忽略它)。

09-10 07:33