c++ - png block 的 CRC32 计算与真实 block 不匹配

标签 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 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/

相关文章:

C++ 服务器应用程序

c++ - 别名模板可以有默认模板参数吗?

c++ - google mock - 如何模拟被测类拥有的对象

c - 这将是什么输出?

python - 如何使用 Python Wand/ImageMagick 将 PSD 转换为 PNG?

c++ - 子类如何使用与子类相同的方法名调用父类(super class)的方法?

c - ^M^Mtypedef enum - 头文件中的杂散字符

自定义分配器 : Valgrind shows 7 allocs, 0 释放,无泄漏

r - 将文本与 R 中可变大小的图对齐

java - 位图图像未锐化