这是在Gimp中制作的黑色1x1 PNG的hexdump,并以最少的信息导出:
89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
00 00 00 01 00 00 00 01 08 02 00 00 00 90 77 53
DE 00 00 00 0C 49 44 41 54 08 D7 63 60 60 60 00
00 00 04 00 01 27 34 27 0A 00 00 00 00 49 45 4E
44 AE 42 60 82
现在看完the specification之后,我很清楚大多数意思是什么,除了IHDR和IDAT块之间的字节30-34: 90 77 53 DE
有人可以启发我吗?
答案 0 :(得分:2)
这些数字是前一个块的CRC校验和。有关概述,请参阅the official specification: 5 Datastream结构,特别是5.3 Chunk layout。
为每个单独的块计算并附加CRC:
对块中前面的字节计算的四字节CRC(循环冗余码),包括块类型字段和块数据字段,但不包括长度字段。 CRC可用于检查数据是否损坏。 CRC始终存在,即使对于不包含数据的块也是如此。
这是您的1x1像素图像,带字节的带注释字节。在每个块IHDR
,IDAT
和IEND
的数据之后,就是前面数据的CRC。
File: test.png
89 50 4E 47 0D 0A 1A 0A
Header 0x89 "PNG" CR LF ^Z LF checks out okay
===========
00 00 00 0D
49 48 44 52
00 00 00 01 00 00 00 01 08 02 00 00 00
90 77 53 DE
block: "IHDR", 13 bytes [49484452]
Width: 1
Height: 1
Bit depth: 8
Color type: 2 = Color
(Bits per pixel: 8)
(Bytes per pixel: 3)
Compression method: 0
Filter method: 0
Interlace method: 0 (none)
CRC: 907753DE
===========
00 00 00 0C
49 44 41 54
08 D7 63 60 60 60 00 00 00 04 00 01
27 34 27 0A
block: "IDAT", 12 bytes [49444154]
expanded result: 4 (as expected)
(Row 0 Filter:0)
decompresses into
00 00 00 00
CRC: 2734270A
===========
00 00 00 00
49 45 4E 44
AE 42 60 82
block: "IEND", 0 bytes [49454E44]
CRC: AE426082
IDAT
数据解压缩为四个0:第一个是行过滤器(0,表示'无')和接下来的3个字节是单个像素的红色,绿色,蓝色值。