我希望更好地了解zlib,deflate和PNG编码。话虽如此,我在将RFC-1950和RFC-1951的规范应用于PNG的IDAT部分时遇到了麻烦。
下面是图像的二进制文件。
示例图片为50x50,所有像素均为RGB(255,0,0)。
好的,在IDAT之后,需要zlib指定的两个字节; CMF [0000029]
,然后是FLG [000002a]
(无FLG.FDICT)。如预期的那样,十六进制为78DA
,这意味着使用DEFLATE,32K窗口和高压缩级别。
从下一个字节的最低有效位开始,DEFLATE标头将有3个位,一个位用于指定最后一个块,另外两个位用于压缩类型(无,固定,或动态)[000002b]
。
要读取位,请参见this。
0000024: 01000011 01001001 01000100 01000001 01010100 01111000 CIDATx
000002a: 11011010 11101101 11001111 00110001 00010001 00000000 ...1..
0000030: 00000000 00001000 00000000 10100001 11101111 01011111 ....._
0000036: 01011010 00110011 10111000 01111010 00001100 00000100 Z3.z..
000003c: 10100000 10101001 11111001 00100000 00010001 00010001 ... ..
0000042: 00010001 00010001 00010001 00010001 00010001 00010001 ......
0000048: 00010001 00010001 00010001 00010001 00010001 00010001 ......
000004e: 00010001 00010001 00010001 00010001 00010001 00010001 ......
0000054: 00010001 00010001 00010001 00010001 00010001 00010001 ......
000005a: 00010001 00010001 00010001 00010001 00010001 00010001 ......
0000060: 00010001 00010001 00010001 00010001 00010001 10010001 ......
0000066: 10001011 00000101 10110000 00110011 01110101 10010110 ...3u.
000006c: 01111001 11000101 00011100 10110001 00000000 00000000 y.....
0000072: 00000000 00000000 01001001 01000101 01001110 01000100 ..
答案 0 :(得分:1)
接下来的三位来自11101101
的底部。 101
是动态块的10
,1
表示这是最后一个块。这将启动一个61字节的deflate流,然后将其解码为以下内容(由infgen分解):
last
dynamic
litlen 0 2
litlen 255 4
litlen 256 4
litlen 274 4
litlen 283 4
litlen 285 1
dist 3 1
dist 15 1
literal 0 255 0 0 255
match 196 4
literal 0
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 258 201
match 44 4
end
第一个解压缩的字节为零,然后解压缩为10,050个字节。