【问题标题】:What do these bytes do?这些字节有什么作用?
【发布时间】:2015-07-04 08:01:09
【问题描述】:

这是一个用 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

谁能启发我?

【问题讨论】:

    标签: format png file-format


    【解决方案1】:

    这些数字是前一个块的 CRC 校验和。请参阅the official specification5 数据流结构 了解一般概述,尤其是5.3 Chunk layout

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

    一个四字节的CRC(Cyclic Redundancy Code),根据chunk中前面的字节计算,包括chunk type字段和chunk data字段,但不包括length字段。 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 个字节是第一个的红色、绿色、蓝色值单个像素。

    【讨论】:

    • +1 您可以通过说“(每个样本的位数:8);(每个像素的样本:3)”来稍微澄清一下,在最后一句中,“样本”而不是“值”。
    • @GlennRanders-Pehrson:这是我自己编写的 PNG 解码器的裸输出,当时我认为不需要确切的术语 :) 无论如何,我确实发现了一个概念缺陷:“位”部分实际上是每通道位,而不是“每像素/值”。 (也许我需要(再次!)阅读规范以了解适当的条款。)
    • 在 CRC 和 Header 之间,似乎是 4 个字节......什么?垃圾数据? 00 00 00 0D 在 49 48 44 52 (IHDR) 之前 00 00 00 0C 在 49 44 41 54 (IDAT) 之前 00 00 00 00 在 49 45 4E 44 (IEND) 之前 还有点赞。很棒的打印输出。
    • @J.M.I.MADISON:这些绝对不是垃圾!这些十六进制线的顺序是lengthchunk_ID、dara、CRCIEND 没有数据线,因为数据长度为 0。另见规格。
    猜你喜欢
    • 2013-11-09
    • 1970-01-01
    • 2010-11-28
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多