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

Rau*_*har 7 c c++ linux crc32 linux-kernel

我在我身上调用了两个函数char* s = "pratik":

用户代码:

#include <zlib.h>
int main()
{
    char *s = "pratik";
    printf("%x\n",crc32(0x80000000, s, strlen(s)));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:66fa3c99

内核代码:

#include <linux/crc32.h>

int main()
{
    char *s = "pratik";

    u32 checksum = crc32(0x80000000, s, strlen(s));
    printk("\nChecksum --> %x", checksum);

    return checksum;
}
Run Code Online (Sandbox Code Playgroud)

输出:

校验和 - > d7389d3a

为什么相同字符串的校验和值不同?

Mar*_*ler 12

似乎有人对标准以太网(PKZIP,ITU V.42等等)CRC-32进行前后排他性或与之相关的事实感到不安0xffffffff.因此,Linux内核中的版本将其排除在外,并期望应用程序执行此操作.去搞清楚.

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

crc_final = crc32(crc_initial ^ 0xffffffff, buf, len) ^ 0xffffffff;
Run Code Online (Sandbox Code Playgroud)

实际上,完全相同的代码也允许您crc32()使用zlib 复制Linux crc32().