我正在寻找C或C ++中CRC32的实现,明确许可为无成本或公共域。实现here似乎很好,但它对许可证的唯一说法是“源代码”,这还不够好。我更喜欢非LGPL,所以我不必愚弄DLL(我的应用程序是封闭源代码)。我在zlib中看到了adler32实现,但是我正在检查小块数据,这对adler来说并不好。
答案 0 :(得分:32)
SNIPPETS C Source Code Archive有CRC32 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。其中包含CRC,license很好。
答案 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 LGPL或类似。但是,该网站确实表示他们将代码放在公共域中以供任何使用。实际的代码文件也说明了这一点。
希望它有所帮助!
答案 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.txt和the 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)