57

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

4

9 回答 9

39

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已将其存档。)

为了能够编译代码,您需要将 typedefs 添加为BYTE无符号 8 位整数和DWORD无符号 32 位整数,以及头文件crc.hsniptype.h

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

#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
于 2008-11-19T19:16:30.593 回答
31

我是指定链接源代码的作者。虽然源代码许可的意图尚不清楚(将在今天晚些时候发布),但代码实际上是开放且免费的,可在您的免费或商业应用程序中免费使用,不附带任何条件。

于 2009-02-03T13:26:35.880 回答
27

使用Boost C++ 库。那里包含一个CRC,并且许可证很好。

于 2008-11-19T18:47:21.917 回答
18

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

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

于 2012-02-21T05:33:40.473 回答
16

使用 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);
于 2014-07-29T15:08:23.933 回答
5

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

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

于 2009-10-05T11:28:37.847 回答
5

我发现的最简单直接的 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 值和反射选项。

该许可证没有明确定义 ala LGP​​L 或类似的。然而,该网站确实表示他们将代码置于公共领域以供任何使用。实际的代码文件也这么说。

希望能帮助到你!

于 2016-01-25T19:34:03.400 回答
4

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
于 2011-01-03T20:33:49.170 回答
1

rurban 的 SMHasher 分支(最初的 SMHasher 似乎已被废弃)具有硬件 CRC32 支持。更改是在初始提交之前添加的,但尝试比较新的 CMakeLists.txt旧的(根本没有提到 SSE)。

最好的选择可能是英特尔的 zlib 分支,本文描述了支持 PCLMULQDQ的功能。该库还具有 SSE 4.2 优化

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

于 2014-04-25T18:53:33.097 回答