为什么 PNG 包含 NLEN(LEN 的补码)?

Why does PNG include NLEN (one's complement of LEN)?

PNG spec中,未压缩的块包含两条头信息:

LEN is the number of data bytes in the block. NLEN is the one's complement of LEN

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

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

您提供的 link 未指向 http://www.w3.org/TR/PNG/ but only to this part: the DEFLATE compression scheme. NLEN is not mentioned in the official specs; it only says the default compression is done according to zlib (https://www.rfc-editor.org/rfc/rfc1950), and therefore DEFLATE (https://www.rfc-editor.org/rfc/rfc1951 处的官方 PNG 规范。

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

除了直接数据损坏外,一个愚蠢的(或配置不当的)传输程序可能会尝试解释某些字节,例如将 Carriage Return (0x0D) 更改为 Newline (0x0A),这在当时是一个常见的选项。 “One's complement”是将 0 到 1 和反向的每个位的反转。如果LENNLEN中的任何一个恰好被传输软件乱码或更改,则其补码将不再匹配。

有效地,LENNLEN 的存在使防止传输错误的保护级别加倍:如果它们不匹配,就会出现错误。它在 zlib 的 ADLER32 上添加了另一层错误检查,并且 PNG 拥有每块校验和。