2

我试图模仿用于在 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 块类型的地址。
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 交流电

如果有人能告诉我为什么我的计算失败了,或者给我一个可以工作的 CRC32 函数,我将不胜感激。谢谢!

4

1 回答 1

2

此处描述了 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

于 2013-10-30T21:47:24.293 回答