这些字节有什么作用?

时间:2015-04-25 18:36:43

标签: format png file-format

这是在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

有人可以启发我吗?

1 个答案:

答案 0 :(得分:2)

这些数字是前一个块的CRC校验和。有关概述,请参阅the official specification 5 Datastream结构,特别是5.3 Chunk layout

为每个单独的块计算并附加CRC:

  

对块中前面的字节计算的四字节CRC(循环冗余码),包括块类型字段和块数据字段,但不包括长度字段。 CRC可用于检查数据是否损坏。 CRC始终存在,即使对于不包含数据的块也是如此。

这是您的1x1像素图像,带字节的带注释字节。在每个块IHDRIDATIEND的数据之后,就是前面数据的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个字节是单个像素的红色,绿色,蓝色值。