我在char* s = "pratik"
as 上调用两个函数:
用户代码:
#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
为什么相同字符串上的校验和的值不同?
似乎有人对标准以太网(PKZIP,ITU V.42等)CRC-32进行前后异或运算感到不安0xffffffff
。因此,Linux内核中的版本将其排除在外,并希望应用程序能够做到这一点。去搞清楚。
无论如何,crc32()
使用(非标准)Linux 可以得到与(正确的)zlib相同的结果crc32()
,因此:
crc_final = crc32(crc_initial ^ 0xffffffff, buf, len) ^ 0xffffffff;
实际上,使用完全相同的代码,您还可以crc32()
使用zlib 复制Linux crc32()
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句