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

问题描述 投票:0回答:1

我在我的

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";
    printf("%x\n", crc32(0x80000000, s, strlen(s)));
    return 0;
}

输出:

d7389d3a

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

c linux linux-kernel checksum crc32
1个回答
21
投票

似乎有人对标准以太网(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()

© www.soinside.com 2019 - 2024. All rights reserved.