我正在努力了解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库来解压缩数据。