我从 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() 给出与在线版本相同的结果