【发布时间】:2020-09-21 20:57:41
【问题描述】:
在section 5.5 of the PNG Specification,它以称为“CRC”或“循环冗余码”的PNG 文件格式讨论了这个概念。我以前从未听说过它,所以我试图理解它。
使用的 CRC 多项式是
x32 + x26 + x23 + x22 + x16 sup> + x12 + x11 + x10 + x8 + x7 sup> + x5 + x4 + x2 + x + 1
在PNG中,32位CRC被初始化为全1,然后数据 从每个字节被处理从最低有效位(1)到 最高有效位 (128)。处理完所有数据字节后, CRC 被反转(取其补码)。这个值是 首先传输(存储在数据流中)MSB。为了...的目的 分成字节和排序,最低有效位 32位CRC被定义为x31项的系数。
那么让我告诉你我理解和不理解的地方。
我听说过多项式,但在这种情况下,我对它们在此处的实现方式有些困惑。
在这种情况下,“x”应该代表什么? 32 位循环中的当前位?这将我们带到下一部分:
所以它说创建一个空的 32 位数字(或者更确切地说,全部设置为 1,所以 32 个 1),然后它说它“从最低有效位 (1) 处理到最高有效位 (128) ”,但问题是,what 的“最少...最多..significant bit”?
块中的其他数据?
如果块以字节为单位设置,并且这只有 32 位,那它是如何工作的?如果块数据中有超过 32 位怎么办(肯定有?)
这是否意味着“多项式”的“最少..最多..有效位”?
但是多项式究竟代表什么? x^32 是什么?
x 代表什么?
对上述问题的任何帮助,也许还有一个简单的例子,比如 IDATA 块(AKA 用基本解释为它计算 CRC 块)会很好:
0 0 2 3 IDAT 0 1 0 1 0 1 0 1 0 1 0 C
最后一个字节“C”应该被替换为它所说的 32 位 CRC。
谁能给我一个实际的例子?
【问题讨论】:
-
"我不知道他们在 for 循环中从哪里得到这么大的位数,也不知道在哪里插入字节数组" - 这是 32 位的标准数字之一CRC。转到wiki article,然后向下滚动到 32 位 CRC,您会在那里看到 CRC 的选择方式很复杂,我不知道为什么要从一组具有相同的 CRC 中选择特定的 CRC错误检测能力。
-
@rcgldr 嗨,谢谢,我在 wiki 上注意到它提供了一些示例,使用来自其他示例问题的相同多项式。问题是我想了解如何从多项式中得出那个 32 位数组。我仍然很困惑“x”代表什么,它在另一个答案中提到没有“插入”它,但是它是什么,该多项式如何给出 4 个不同的位结果?另一点是,一旦我 拥有 32 位字符串,那么我该如何处理另一个输入,我是否会遍历另一个字节数组然后做一些事情,但是呢?
-
@rcgldr 我也搜索了一个 javascript 解决方案,我能找到的只是这个 medium.com/the-guardian-mobile-innovation-lab/… 但他们使用了 CRC 的内置函数.. 大多数其他人要么使用画布,或其他一些库,或服务器端代码
-
@rcgldr 问题是我对多种格式和压缩都不感兴趣,我只对一个非常简单的 PNG 生成器感兴趣(主要在谷歌应用程序脚本中运行),而且几乎没有重量极轻的 javascirpt PNG 库(pngJS 太矫枉过正)无法实现我想要的
-
好的,但是即使压缩被关闭,zlib 压缩头和 CRC(我的印象是与 PNG CRC 是分开的)不是必需的吗?你需要一些东西。
标签: javascript png crc libpng crc32