【发布时间】:2017-03-17 22:51:22
【问题描述】:
我在char* s = "pratik" 上调用了两个函数:
用户代码:
#include <zlib.h>
int main()
{
char *s = "pratik";
printf("%x\n",crc32(0x80000000, s, strlen(s)));
return 0;
}
输出: 66fa3c99
内核代码:
#include <linux/crc32.h>
int main()
{
char *s = "pratik";
u32 checksum = crc32(0x80000000, s, strlen(s));
printk("\nChecksum --> %x", checksum);
return checksum;
}
输出:
校验和 --> d7389d3a
为什么相同字符串的校验和值不同?
【问题讨论】:
-
strlen(6)... 你确定吗? -
除了代码中可能出现的错误之外,请记住,CRC 实际上是一个系列算法,由几个选项参数化(首先是摘要大小 - 始终为 32 位在您的情况下-还有使用的多项式、位字节序、初始化值,以及可以在算法的各个阶段执行的一些额外位操作)。鉴于内核实现是为计算网络数据包的 CRC 值而生的,我不会对它反转位字节序感到惊讶。关于 CRC 的一些有趣信息:ross.net/crc/download/crc_v3.txt.
-
虽然生成多项式看起来相同(Linux 引用 ITU V.42,与 what zlib uses 相同,但在
linux/crc32.h中有 little-endian and big-endian versions 的crc32。你可以尝试调用crc32_be而不是? -
@mindriot 当我运行 crc32_be(s) 时,它会打印 B131FB25,它仍然与用户调用不匹配,并且 crc32_le(s) 会打印与内核程序的 crc32(s) 相同的值。
-
也许您还需要更改种子值的字节顺序(可能将
0x80000000替换为0x00000080)?为确保种子不会导致问题,建议您将其设置为 0 并再次比较两个crc32版本。
标签: c++ c linux linux-kernel crc32