CRC32 C或C ++实现

时间:2008-11-19 18:41:38

标签: c++ c crc32

我正在寻找C或C ++中CRC32的实现,明确许可为无成本或公共域。实现here似乎很好,但它对许可证的唯一说法是“源代码”,这还不够好。我更喜欢非LGPL,所以我不必愚弄DLL(我的应用程序是封闭源代码)。我在zlib中看到了adler32实现,但是我正在检查小块数据,这对adler来说并不好。

10 个答案:

答案 0 :(得分:32)

SNIPPETS C Source Code ArchiveCRC32 implementation可自由使用:

/* 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的typedef添加为无符号的8位整数,并将DWORD添加为无符号的32位整数,以及标题文件crc.h& sniptype.h

标题中唯一的关键项是这个宏(可以很容易地进入CRC_32.c本身:

#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))

答案 1 :(得分:25)

使用Boost C++ libraries。其中包含CRClicense很好。

答案 2 :(得分:25)

我是指定链接的源代码的作者。虽然源代码许可证的意图不明确(将在今天晚些时候),但代码实际上是开放的,可以免费用于您的免费或商业应用程序,而且没有任何附加条件。

答案 3 :(得分:17)

zlib(http://zlib.net/)中的crc代码是最快的,并且拥有非常自由的开源许可证。

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

答案 4 :(得分:12)

使用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);

答案 5 :(得分:5)

pycrc是一个生成C CRC代码的Python脚本,可选择CRC大小,算法和模型。

它是在MIT许可下发布的。你的目的是否可以接受?

答案 6 :(得分:4)

我发现最简单直接的C / C ++实现位于本页底部的链接中:

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

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

这是一个简单的独立实现,包含一个.h和一个.c文件。 通过使用define,支持CRC32,CRC16和CRC_CCITT。此外,代码允许用户更改参数设置,如CRC多项式,初始/最终XOR值和反射选项(如果您愿意)。

许可证没有明确定义ala LGP​​L或类似。但是,该网站确实表示他们将代码放在公共域中以供任何使用。实际的代码文件也说明了这一点。

希望它有所帮助!

答案 7 :(得分:2)

mhash library对我来说非常有用。它足够快,支持多种类型的散列(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

答案 8 :(得分:1)

rurban's fork of SMHasher(最初的SMHasher似乎已被遗弃)具有硬件CRC32支持。在初始提交之前添加了更改,但尝试比较the new CMakeLists.txtthe old one(根本没有提到SSE)。

Intel's zlib fork with PCLMULQDQ support中描述的最佳选项可能是this paper。这个库also has the SSE 4.2 optimizations

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

答案 9 :(得分:0)

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

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

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