C 中 <linux/crc32.h> 和 <zlib.h> 的 crc32() 实现之间的区别
Difference between crc32() implementations of <linux/crc32.h> and <zlib.h> in C
我在 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
为什么相同字符串的校验和值不同?
似乎有人对以下事实感到不安:标准以太网(PKZIP、ITU V.42 等)CRC-32 执行预和 post-排他性或 0xffffffff
。所以 Linux 内核中的版本忽略了这一点,并期望应用程序这样做。去图吧。
无论如何,您可以使用(非标准)Linux crc32()
获得与(正确的)zlib crc32()
相同的结果,因此:
crc_final = crc32(crc_initial ^ 0xffffffff, buf, len) ^ 0xffffffff;
事实上,完全相同的代码将允许您使用 zlib crc32()
复制 Linux 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
为什么相同字符串的校验和值不同?
似乎有人对以下事实感到不安:标准以太网(PKZIP、ITU V.42 等)CRC-32 执行预和 post-排他性或 0xffffffff
。所以 Linux 内核中的版本忽略了这一点,并期望应用程序这样做。去图吧。
无论如何,您可以使用(非标准)Linux crc32()
获得与(正确的)zlib crc32()
相同的结果,因此:
crc_final = crc32(crc_initial ^ 0xffffffff, buf, len) ^ 0xffffffff;
事实上,完全相同的代码将允许您使用 zlib crc32()
复制 Linux crc32()
。