png块的CRC32计算与实际块不匹配

时间:2013-10-30 20:56:10

标签: c++ c png checksum crc32

我正在尝试模仿用于在PNG文件中创建CRC的函数,我正在使用autodin II多项式和源代码:
http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/libkern/crc32.c

我的测试全部用于IHDR块,所以我的参数是:
crc - 0xffffffff和0(两者都有建议)
buff - IHDR Chunk类型的地址 length - IHDR Chunk的长度+4(块数据的长度+类型的长度)

我用二进制打印了计算出的CRC,我将其与块的实际CRC进行了比较。我看不出相似之处(小大端,反转位,异或等)。

这是IHDR块的数据(十六进制格式):
长度(大端):d0 00 00 00(13)
型号:49 48 44 52
数据:00 00 01 77 00 00 01 68 08 06 00 00 00
现有CRC:b0 bb 40 ac

如果有人能告诉我为什么我的计算结束了,或者给我一个可行的CRC32功能,我会非常感激。 感谢您!

1 个答案:

答案 0 :(得分:0)

PNG图像中使用的CRC-32算法在这里描述:http://www.w3.org/TR/PNG-Structure.html#CRC-algorithm(还有一个用于进行测试计算的C代码链接)。

但正如@Jigsore指出的那样,你不会从这里发布的数据中得到明智的结果。您已经为我们提供了一个4字节的类型标识符,以及跟随它的7.5字节数据。根据长度标题,总共应该有13个字节。

修改 这可以使用w3.org中的函数:

int main() {
    char input[] = { 0x49,0x48,0x44,0x52,0x00,0x00,0x01,0x77,0x00,
                     0x00,0x01,0x68,0x08,0x06,0x00,0x00,0x00 };
    printf("%08lx\n",crc(input,17));
    return 0;
}

输出: ac40bbb0