我正在尝试模仿用于在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功能,我会非常感激。 感谢您!
答案 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