1

PNG 规范中,未压缩的块包括两条标头信息:

LEN是块中的数据字节数。NLEN是一个的补码LEN

为什么文件会包含一个值的补码?这将如何使用和/或用于什么目的?

4

1 回答 1

3

它的作者没有为 PNG 发明一种新的压缩类型,而是决定使用现有的行业标准:zlib。

您提供的链接不指向http://www.w3.org/TR/PNG/上的官方 PNG 规范,而仅指向这一部分:DEFLATE 压缩方案。NLEN官方规格中未提及;它只是说默认压缩是根据 zlib ( https://www.rfc-editor.org/rfc/rfc1950 ) 完成的,因此 DEFLATE ( https://www.rfc-editor.org/rfc/rfc1951 )。

至于“为什么”:zlib 领先于当今的高速互联网连接,在它被发明的时候,私人互联网通信仍然使用音频线调制解调器完成。只有少数机构能够为数据提供专用固定电话;世界其他地方通过拨号连接。因此,数据传输极易损坏。对于简单的文本文档,损坏的文件可能仍然可用,但在压缩数据中,每一位都很重要。

除了直接的数据损坏之外,愚蠢的(或配置错误的)传输程序可能会尝试解释某些字节,例如将回车 ( 0x0D) 更改为换行 ( 0x0A),这在当时是一种常见的选择。“一个补码”是0到1的每个位的反转,反之亦然。如果其中一个LEN NLEN恰好被传输软件乱码或更改,则其补码将不再匹配。

实际上,两者的存在使LEN防止NLEN传输错误的保护水平加倍:如果它们不匹配,则存在错误。它在 zlib 的 ADLER32 上添加了另一层错误检查,并且 PNG 拥有每个块的校验和。

于 2019-12-21T21:54:39.767 回答