it-swarm.com.de

Implementierung von CRC32 C oder C ++

Ich suche nach einer Implementierung von CRC32 in C oder C++, die ausdrücklich als kostenlos oder gemeinfrei lizenziert ist. Die Implementierung hier scheint nett zu sein, aber das einzige, was über die Lizenz gesagt wird, ist "Quellcode", was nicht gut genug ist. Ich bevorzuge keine LGPL, damit ich nicht mit einer DLL (meine App ist eine geschlossene Quelle)) herumalbern muss. Ich habe die Implementierung von adler32 in zlib gesehen, aber ich überprüfe kleine Teile von Daten, für die Adler nicht gut ist.

52
twk

Verwenden Sie die Boost C++ - Bibliotheken . Dort ist ein CRC enthalten und die Lizenz ist gut.

24
Zan Lynx

Das SNIPPETS C Source Code Archive hat eine CRC32-Implementierung die frei verwendbar ist:

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

(Leider scheint c.snippets.org gestorben zu sein. Glücklicherweise hat die Wayback-Maschine sie archiviert.)

Um den Code kompilieren zu können, müssen Sie typedefs für BYTE als vorzeichenlose 8-Bit-Ganzzahl und DWORD als vorzeichenlose 32-Bit-Ganzzahl zusammen mit dem Header hinzufügen files crc.h & sniptype.h .

Der einzige kritische Punkt in der Kopfzeile ist dieses Makro (das genauso einfach in CRC_32.c selbst eingefügt werden kann:

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

Ich bin der Autor des Quellcodes unter dem angegebenen Link. Obwohl die Absicht der Quellcodelizenz nicht klar ist (es wird später sein), ist der Code tatsächlich offen und frei für die Verwendung in Ihren kostenlosen oder kommerziellen Anwendungen, ohne dass Bedingungen daran geknüpft sind.

27
NTDLS

Der crc-Code in zlib (http://zlib.net/) ist einer der schnellsten und verfügt über eine sehr liberale Open-Source-Lizenz.

Und Sie sollten adler-32 nur für spezielle Anwendungen verwenden, bei denen die Geschwindigkeit wichtiger ist als die Leistung bei der Fehlererkennung.

17
Mark Adler

mit 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);
12
giuspen

pycrc ist ein Python= Skript, das C CRC Code generiert, mit Optionen zur Auswahl des CRC-Größe, Algorithmus und Modell.

Es wird unter der Lizenz MIT veröffentlicht. Ist das für Ihre Zwecke akzeptabel?

5
John Carter

Die einfachste und einfachste C/C++ - Implementierung, die ich gefunden habe, befindet sich in einem Link am Ende dieser Seite:

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

Code Download Link: https://barrgroup.com/code/crc.Zip

Es ist eine einfache eigenständige Implementierung mit einer .h- und einer .c-Datei. Es gibt Unterstützung für CRC32, CRC16 und CRC_CCITT durch die Verwendung eines Defines. Mit dem Code kann der Benutzer auch Parametereinstellungen wie das CRC-Polynom, den Anfangs-/Endwert XOR) und die Reflektionsoptionen ändern, wenn Sie dies wünschen.

Die Lizenz ist nicht explizit als LGPL oder ähnlich definiert. Die Site gibt jedoch an, dass sie den Code für jede Verwendung öffentlich zugänglich macht. Das sagen auch die eigentlichen Codedateien.

Ich hoffe es hilft!

4
Martin M.

Die Mhash-Bibliothek funktioniert ziemlich gut für mich. Es ist schnell genug und unterstützt mehrere Arten von Hashing (crc32, MD5, SHA-1, HAVAL, RIPEMD128, RIPEMD160, TIGER, GOST usw.). Um CRC32 eines Strings zu erhalten, würden Sie ungefähr so ​​vorgehen:

 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
2
Nazar

Rurbans Fork von SMHasher (der ursprüngliche SMHasher scheint aufgegeben zu sein) hat Hardware-CRC32-Unterstützung. Die Änderungen wurden vor dem ersten Festschreiben hinzugefügt, aber versuchen Sie, die neue CMakeLists.txt und die alte (die nicht SSE) erwähnt = überhaupt).

Die beste Option ist wahrscheinlich Intels Zlib-Fork mit PCLMULQDQ-Unterstützung beschrieben in dieses Dokument . Diese Bibliothek hat auch die SSE 4.2 Optimierungen .

Wenn Sie keine Portabilität benötigen und unter Linux arbeiten, können Sie die Kernel-Implementierung verwenden (sofern verfügbar hardwarebeschleunigt): https://stackoverflow.com/a/11156040/30948

1
Janus Troelsen

Ich bin auf diesen nützlichen Artikel zur Prüfsummenberechnung gestoßen.

"Berechnen von CRC-Prüfsummen in C++" auf der Dr.dobbs-Website.

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

0
WindowsPistha