这些字节有什么作用?

cru*_*her 5 format png file-format

这是用 Gimp 制作的黑色 1x1 PNG 的十六进制转储,并以最少的信息导出:

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
Run Code Online (Sandbox Code Playgroud)

现在,在阅读规范后,我非常确定其中大多数的含义,除了 IHDR 和 IDAT 块之间的字节 30-34:90 77 53 DE

有人可以启发我吗?

usr*_*301 3

这些数字是前一个块的 CRC 校验和。请参阅官方规范5 Datastream 结构的总体概述,特别是5.3 Chunk 布局

计算 CRC 并将其附加到每个单独的块:

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

这是您的 1x1 像素图像,逐字节注释。紧接着每个块的数据IHDRIDAT、 和 的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
Run Code Online (Sandbox Code Playgroud)

数据IDAT解压缩为四个 0:第一个是行过滤器(0,表示“无”),接下来的 3 个字节是单个像素的红、绿、蓝值。