我试图模仿用于在 PNG 文件中创建 CRC 的函数,我使用的是 autodin II 多项式和源代码:
http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/bsd/libkern/crc32.c
我的测试都是针对 IHDR block 的,所以我的参数是:
crc - 0xffffffff 和 0(均已建议)
buff - IHDR Chunk 类型的地址。
length - IHDR block 的长度 + 4( block 数据的长度 + 类型的长度)
我以二进制形式打印了计算出的 CRC,并将其与 block 的实际 CRC 进行了比较。我看不出任何相似之处(小端-大端、反转位、异或等)。
这是 IHDR block 的数据(十六进制格式):
长度(大端):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 函数,我将不胜感激。 谢谢!
最佳答案
此处描述了 PNG 图像中使用的 CRC-32 算法:http://www.w3.org/TR/PNG-Structure.html#CRC-algorithm (还有用于进行测试计算的 C 代码链接)。
但正如@Jigsore 指出的那样,您不会从此处发布的数据中获得合理的结果。您已经给了我们一个 4 字节的类型标识符,后面跟着看起来像是 7.5 字节的数据。按照长度header一共应该有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
关于c++ - png block 的 CRC32 计算与真实 block 不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19693649/