zlib解压缩如何在PNG IDAT块上工作



我正在努力了解PNG文件是如何工作的。我一直纠结于如何解压缩IDAT数据。我搜索了整个互联网,但没有找到任何我能理解的东西。

我有一个示例PNG的HEX代码。

我提取了IDAT块的数据,这里是十六进制的:08 1D 63 60 60 60 F8 0F 00 01 04 01 00 1E 73 9C 40

我不知道该如何解压。我得到了第一个字节,它是压缩模式/标志代码,第二个字节是附加标志,最后四个字节是检查值。它们是什么意思?现在如何解压缩数据?

我想我会通过一个或多个例子来理解它。以下是来自另一个PNG文件的IDAT块:18 19 62 64 60 f8 fa 9f 01 08 00 00 00 00 ff ff 63 64 60 f8 fa 9f 81 e1 3f 03 00 29 31 04 ea

如果有人能为这两个例子向我解释zlib解码是如何工作的,我将不胜感激。

您的第一个示例没有正确提取,因为它的末尾有四个无关的字节。如果去掉最后四个字节,那么就得到了一个完整有效的zlib流。

第二个例子是一个完整有效的zlib流。

您需要阅读zlib包装器格式的RFC1950,它描述了每个zlib流的前两个和最后四个字节。介于两者之间的是压缩后的数据,您需要阅读RFC1951。

这两个示例流都使用了固定块,所以即使您了解了如何解压缩这些块,您仍然需要了解更多关于解压缩动态块的内容。你应该找到更大的.PNG文件作为例子。

为了给你一个线索,这里有使用infgen的这两种流的分解:

! infgen 3.0 output
!
zlib
!
last
fixed
literal 0 0 0 0 255
end
!
adler

和:

! infgen 3.0 output
!
zlib
!
fixed
literal 1 0 0 245 255 0
match 3 1
end
!
stored
end
!
last
fixed
literal 1 0 0 245 255 0 0 255 0
end
!
adler

然而,你并不需要知道任何这些来解码PNG文件。您可以使用zlib库来解压缩数据。

最新更新