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

CRC32 calculations for png chunk doesn't match the real one

本文关键字:计算 真实 不匹配 png CRC32 块的      更新时间:2023-10-16

我试图模仿用于在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 块类型的地址。
长度 - IHDR 区块的长度 + 4(区块数据的长度 + 类型的长度)

我以二进制打印了计算出的CRC,并将其与块的实际CRC进行了比较。我看不到任何相似之处(小大端序、反转位、XOR 等)。

以下是 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函数,我将不胜感激。谢谢!

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("%08lxn",crc(input,17));
    return 0;
}

输出: ac40bbb0