CRC为PNG文件格式

时间:2010-03-27 23:52:31

标签: png crc32

我需要读取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 个答案:

答案 0 :(得分:6)

这是在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)。

答案 1 :(得分:4)

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.

答案 2 :(得分:0)

您是否阅读过有关CRC的维基百科文章?没有统一的CRC格式,每个'格式'都建立在这样的多项式上。

我对手工计算CRC也不太熟悉,但你所看到的实际上是POSIX中使用的格式。我确信它有很多有用的实现。

答案 3 :(得分:0)

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