我在我的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()
。