3

我需要读取一个 PNG 文件并解释其中存储的所有信息并以人类可读的格式打印出来。在处理 PNG 时,我了解到它使用 CRC-32 为每个块生成校验和。但我无法理解PNG文件规范网站上提到的以下信息:PNG使用的多项式为:x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

以下是参考链接: http ://www.w3.org/TR/PNG/

谁能帮助我理解这一点?

4

3 回答 3

6

http://en.wikipedia.org/wiki/Computation_of_CRC

根据 wiki 中的 CRC 列表,这个多项式(又名 AUTODIN II 多项式)是最常用的多项式之一。CRC-32-IEEE 802.3 x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1

用于(以太网、V.42、MPEG-2、PNG、POSIX cksum、Arj、Lha32、Rar、Zip 等。)

用以下标记的力量重写^

 x^32 + x^26 + x^23 + x^22 + x^16 + x^12 + x^11 + x^10 + x^8 + x^7 + x^5 + x^4 + x^2 + x + 1.

所以你可以阅读 cksum 的来源,例如这里

http://www.opensource.apple.com/source/file_cmds/file_cmds-188/cksum/crc32.c

32 位 AutoDIN-II CRC 建立在以下移位寄存器参考模型之上。

多项式:g(x) = 1 + x + x^4 + x^5 + x^7 + x^8 + x^10 + x^11 + x^12 + x^1 + x^22 + x^23 + x^26 + x^32

先输入数据位 0

Leading-zero checking is performed by the following procedure:

 1. The crc register is initialized to 0xffffffff, not zero.

 2. When a crc is appended, the 32 bits of the crc are inverted.

 3. When checking a good message with an appended crc, the register
    will return to the fixed value of 0xdebb20e3, rather than zero.
于 2010-03-27T23:55:50.300 回答
4

这就是 zlib 中实现的 CRC-32 算法。当您可以使用该库时,请不要实现您自己的库。


[编辑]:如何使用 zlib 中的 CRC 计算器(从 zlib 文档中提取的 C 示例)。

#include <zlib.h>

uLong crc = crc32(0L, Z_NULL, 0);

while (read_buffer(buffer, length) != EOF) {
   crc = crc32(crc, buffer, length);
}
if (crc != original_crc) error();

如果您有要获取 CRC 的数据块,则不需要该 while 循环;您只需获得初始值(第一次分配给crc上面),然后计算您拥有的数据的值(第二次分配给crc)。

于 2010-03-28T00:06:27.357 回答
0

每个 x 项指的是0xedb88320的二进制表示中的 1 ,即 11101101 10111000 10000011 00100000。左侧(最低有效)端的数字 1 是常数 (x^0) 项的(系数)。左起下一个数字 1 是 x 项的系数。下一个数字 1 是 x^2 项的系数。下一个数字 0 是 x^3 项的系数(因为 0*x^3 = 0 不存在)。等等。右端(最显着)的右边有一个隐含的 1,它是 x^32 项的系数。

于 2020-06-30T09:07:59.930 回答