crc32() 从 zlib 生成的 CRC 不同于使用在线 CRC 生成器生成的 CRC

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

我从 https://github.com/madler/zlib 编译了 ZLIB,我想使用 CRC32 函数。我正在运行以下代码:

#include <stdio.h>
#include <stdlib.h>
#include "zlib.h"

int main(void) {
    Bytef buffer[] = {0x01, 0x02, 0x03, 0x04};

    uLong crc = crc32(0L, Z_NULL, 0);
    crc = crc32(crc, buffer, 4);

    return EXIT_SUCCESS;
}

运行该代码时,我得到 crc = 0xb63cfbcd

为了了解它是如何工作的,我尝试使用 http://www.sunshine2k.de/coding/javascript/crc/crc_js.html 获得相同的值。我尝试了很多配置,但无法获得相同的 CRC

分析代码后,我看到 crc32() 在函数的开头做了预处理,在 RETURN 之前做了后处理

    /* Pre-condition the CRC */
    crc = (~crc) & 0xffffffff;

...

    while (len) {
        len--;
        test = *buf;
        crc = (crc >> 8) ^ crc_table[(crc ^ *buf++) & 0xff];
    }

    /* Return the CRC, post-conditioned. */
    return crc ^ 0xffffffff;

我删除了前后调节,现在我可以将 crc() 的结果与在线版本匹配:

crc() 和在线版本的结果:0x977824d1 在线配置: 输入反映:真 输出反映:真 多项式:0x04C11DB7 初始值:0 最终异或值:0 CRC 输入数据(字节):0x01 0x02 0x03 0x04

我了解所有配置,但我不了解前/后调节的目的。有人可以帮我吗?

我希望 CRC32() 给出与在线版本相同的结果

zlib crc crc32
1个回答
0
投票

点击“CRC-32”按钮,第一个预定义条目“CRC-32”,在数据字段中输入“0x01、0x02、0x03、0x04”,然后点击“计算 CRC!”。然后它说:

结果CRC值:0xB63CFBCD

没有比这更简单的了。

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