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

Jef*_*son 3 png ones-complement

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

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

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

小智 5

它的作者没有为 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 自己的每块校验和的基础上添加了另一层错误检查。