C中的<linux / crc32.h>和<zlib.h>的crc32()实现之间的区别

我在我的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

为什么相同string的校验和的值不同?

似乎有人被标准以太网(PKZIP,ITU V.42等等)CRC-32做了事前和事后排斥或者带有0xffffffff的事实感到困扰。 所以Linux内核中的版本就没有这个功能了,而且希望应用程序能够这样做。 去搞清楚。

无论如何,您可以使用(非标准)Linux crc32()来获得与(正确的)zlib crc32()相同的结果,因此:

 crc_final = crc32(crc_initial ^ 0xffffffff, buf, len) ^ 0xffffffff; 

事实上,完全相同的代码将允许您使用zlib crc32()来复制Linux crc32()