質問
無料またはパブリックドメインとして明示的にライセンスされているCまたはC ++でのCRC32の実装を探しています。実装はこちらのように見えますが、ライセンスについて述べているのは" sourceコード」、これは十分ではありません。 LGPL以外を好むので、DLLをだます必要はありません(私のアプリはクローズドソースです)。 zlibでadler32の実装を見ましたが、小さなデータの塊をチェックしていますが、これはadlerには向いていません。
解決
Boost C ++ライブラリを使用します。 CRC が含まれており、ライセンスは適切です。
他のヒント
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 。
ヘッダー内の唯一の重要な項目はこのマクロです(CRC_32.c自体にも簡単に追加できます:
#define UPDC32(octet, crc) (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8))
私は、指定されたリンクのソースコードの作成者です。ソースコードライセンスの意図は明確ではありませんが(本日中に公開されます)、実際にはコードは公開されており、文字列が添付されていない無料または商用アプリケーションで使用できます。
zlib(http://zlib.net/)のcrcコードは最速であり、非常に寛大なオープンソースライセンスを持っています。
また、エラー検出のパフォーマンスよりも速度が重要な特別なアプリケーションを除き、adler-32を使用しないでください。
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);
pycrc は、C CRCコードを生成するPythonスクリプトです。 CRCサイズ、アルゴリズム、モデルを選択するオプション。
これは、MITライセンスの下でリリースされています。それはあなたの目的に受け入れられますか?
私が見つけた最も単純でわかりやすいC / C ++実装は、このページの下部にあるリンクにあります。
ウェブページ: http:// www。 barrgroup.com/Embedded-Systems/How-To/CRC-Calculation-C-Code
コードダウンロードリンク: https://barrgroup.com/code/crc.zip
これは、1つの.hファイルと1つの.cファイルを持つ単純なスタンドアロン実装です。 defineの使用により、CRC32、CRC16、およびCRC_CCITTがサポートされます。また、このコードにより、ユーザーは必要に応じてCRC多項式、初期/最終XOR値、反射オプションなどのパラメーター設定を変更できます。
ライセンスは、LGPLまたは同様のものとして明示的に定義されていません。ただし、このサイトでは、使用目的のためにコードをパブリックドメインに配置していると述べています。実際のコードファイルにもこれが記載されています。
お役に立てばと思います!
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
rurbanのSMHasherのフォーク(元のSMHasherは放棄されたようです)は、ハードウェアCRC32をサポートしています。変更は最初のコミットの前に追加されましたが、新しいCMakeListsを比較してみてください。 txt および古い( SSEについてはまったく言及していません)。
おそらく、 PCLMULQDQをサポートするIntelのzlibフォークがこの論文。このライブラリには、 SSE 4.2最適化もあります。
>移植性が不要でLinuxを使用している場合は、カーネルの実装(使用可能な場合はハードウェアアクセラレーションを使用)を使用できます: https://stackoverflow.com/a/11156040/309483
チェックサムの計算に関するこの便利な記事に出会いました。
&quot; C ++でのCRCチェックサムの計算&quot; Dr.dobbsウェブサイトで。