CRC32 C或C ++实现

我正在寻找在C或C ++中实现CRC32的实现,该实现已明确许可为免费或公共领域。 这里的实现看起来不错,但是它唯一说明许可证的是“源代码”,这还不够好。 我更喜欢非LGPL,所以我不必无所事事的DLL(我的应用程序是封闭源代码)。 我在zlib中看到了adler32的实现,但是我正在检查一小部分数据,这对adler不利。

twk asked 2020-01-13T07:04:59Z
10个解决方案
33 votes

SNIPPETS C源代码存档具有可自由使用的CRC32实现:

/* Copyright (C) 1986 Gary S. Brown.  You may use this program, or
   code or tables extracted from it, as desired without restriction.*/

(不幸的是,c.snippets.org似乎已经死了。幸运的是,Wayback Machine已将其存档。)

为了能够编译代码,您需要为BYTE(作为无符号的8位整数)和DWORD(作为无符号的32位整数)以及头文件crc.h和sniptype.h添加typedef。

标头中唯一关键的项目是此宏(可以很容易地将其放入CRC_32.c本身:

#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
cjm answered 2020-01-13T07:05:41Z
27 votes

我是指定链接上源代码的作者。 尽管尚不清楚源代码许可的意图(今天将在今天晚些时候),但实际上该代码是开放的,并且可以免费用于不附带任何字符串的免费或商业应用程序中。

NTDLS answered 2020-01-13T07:06:01Z
24 votes

使用Boost C ++库。 那里包括一个CRC,而且牌照很好。

Zan Lynx answered 2020-01-13T07:05:07Z
17 votes

zlib([http://zlib.net/)]中的crc代码是最快的代码之一,并且具有非常宽松的开源许可证。

而且,除了速度比错误检测性能更重要的特殊应用程序外,您不应使用adler-32。

Mark Adler answered 2020-01-13T07:06:26Z
12 votes

使用zlib.h([http://refspecs.linuxbase.org/LSB_3.0.0/LSB-Core-generic/LSB-Core-generic/zlib-crc32-1.html):]

#include <zlib.h>
unsigned long  crc = crc32(0L, Z_NULL, 0);
crc = crc32(crc, (const unsigned char*)data_address, data_len);
giuspen answered 2020-01-13T07:06:46Z
5 votes

pycrc是生成C CRC代码的Python脚本,具有用于选择CRC大小,算法和模型的选项。

它是根据MIT许可证发布的。 可以接受吗?

John Carter answered 2020-01-13T07:07:11Z
4 votes

我找到的最简单,最直接的C / C ++实现在此页面底部的链接中:

网页:[http://www.barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code]

代码下载链接:[https://barrgroup.com/code/crc.zip]

这是一个简单的独立实现,具有一个.h和一个.c文件。通过使用定义对CRC32,CRC16和CRC_CCITT的支持。 同样,该代码还允许用户根据需要更改参数设置,例如CRC多项式,初始/最终XOR值和反射选项。

该许可证未明确定义为LGPL或类似名称。 但是该网站确实表示,他们会将代码放置在公共领域中,以供任何使用。 实际的代码文件也这样说。

希望能帮助到你!

Martin M. answered 2020-01-13T07:07:54Z
3 votes

mhash库对我来说很好。 它足够快,支持多种哈希(crc32,MD5,SHA-1,HAVAL,RIPEMD128,RIPEMD160,TIGER,GOST等)。 要获取字符串的CRC32,您可以执行以下操作:

 MHASH td = mhash_init(MHASH_CRC32);

 if (td == MHASH_FAILED) return -1; // handle failure

 mhash(td, s, strlen(s));

 unsigned int digest = 0; // crc32 will be stored here

 mhash_deinit(td, &digest);

 // do endian swap here if desired
Nazar answered 2020-01-13T07:08:15Z
1 votes

SMHasher的rurban分支(原始的SMHasher似乎已被放弃)具有硬件CRC32支持。 所做的更改是在首次提交之前添加的,但是请尝试将新的CMakeLists.txt与旧的进行比较(根本不提及SSE)。

最好的选择可能是本文所述的支持PCLMULQDQ的Intel zlib fork。 该库还具有SSE 4.2优化。

如果不需要可移植性,并且在Linux上,则可以使用内核的实现(如果可用,可以通过硬件加速):[https://stackoverflow.com/a/11156040/309483]

Janus Troelsen answered 2020-01-13T07:08:44Z
0 votes

我碰到了这篇有关校验和计算的有用文章。

Dr.dobbs网站上的“在C ++中计算CRC校验和”。

[http://drdobbs.com/184403658?pgno=3]

WindowsPistha answered 2020-01-13T07:09:13Z
translate from https://stackoverflow.com:/questions/302914/crc32-c-or-c-implementation