Domanda

Sto cercando un'implementazione di CRC32 in C o C ++ che sia esplicitamente concesso in licenza come gratuito o di dominio pubblico. L'implementazione qui sembra buona, ma l'unica cosa che dice sulla licenza è " source codice " ;, che non è abbastanza buono. Preferirei non LGPL, quindi non devo scherzare con una DLL (la mia app è di tipo chiuso). Ho visto l'implementazione di adler32 in zlib, ma sto controllando piccoli blocchi di dati, per cui adler non va bene.

È stato utile?

Soluzione

Utilizza le Potenzia le librerie C ++ . C'è un CRC incluso lì e il la licenza è valida.

Altri suggerimenti

Il Archivio codice sorgente SNIPPETS ha a Implementazione CRC32 che è liberamente utilizzabile:

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

(Sfortunatamente, c.snippets.org sembra essere morto. Fortunatamente, la Wayback Machine è stata archiviata .)

Per poter compilare il codice, devi aggiungere typedefs per BYTE come numero intero a 8 bit senza segno e DWORD come 32- senza segno bit intero, insieme ai file di intestazione crc.h & amp; sniptype.h .

L'unico elemento critico nell'intestazione è questa macro (che potrebbe facilmente andare in CRC_32.c stesso:

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

Sono l'autore del codice sorgente al link specificato. Sebbene l'intenzione della licenza del codice sorgente non sia chiara (lo sarà più tardi oggi), il codice è in realtà aperto e gratuito per l'uso nelle applicazioni gratuite o commerciali senza stringhe allegate.

Il codice crc in zlib (http://zlib.net/) è tra i più veloci che ci siano e ha una licenza open source molto liberale.

E non dovresti usare adler-32 ad eccezione di applicazioni speciali in cui la velocità è più importante delle prestazioni di rilevamento degli errori.

utilizzando 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 è uno script Python che genera codice C CRC, con opzioni per selezionare la dimensione, l'algoritmo e il modello CRC.

È rilasciato sotto licenza MIT. È accettabile per i tuoi scopi?

L'implementazione C / C ++ più semplice e diretta che ho trovato è in un link in fondo a questa pagina:

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

Link per il download del codice: https://barrgroup.com/code/crc.zip

È una semplice implementazione standalone con un file .h e un file .c. C'è il supporto per CRC32, CRC16 e CRC_CCITT attraverso l'uso di un define. Inoltre, il codice consente all'utente di modificare le impostazioni dei parametri come il polinomio CRC, il valore XOR iniziale / finale e le opzioni di riflessione se lo desideri.

La licenza non è esplicitamente definita come LGPL o simili. Tuttavia, il sito afferma che stanno mettendo il codice di dominio pubblico per qualsiasi uso. Lo dicono anche i file di codice attuali.

Spero che sia d'aiuto!

La libreria mhash funziona abbastanza bene per me. È abbastanza veloce, supporta diversi tipi di hashing (crc32, MD5, SHA-1, HAVAL, RIPEMD128, RIPEMD160, TIGER, GOST, ecc.). Per ottenere CRC32 di una stringa devi fare qualcosa del genere:

 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

il fork di SMHasher di rurban (SMHasher originale sembra abbandonato) ha il supporto hardware CRC32. Le modifiche sono state aggiunte prima del commit iniziale, ma prova a confrontare new CM. txt e quello vecchio ( che non menziona affatto SSE).

L'opzione migliore è probabilmente Fork Intel zlib con supporto PCLMULQDQ descritto in questo documento . Questa libreria ha anche le ottimizzazioni SSE 4.2 .

Se non hai bisogno di portabilità e sei su Linux, puoi usare l'implementazione del kernel (che è accelerata dall'hardware se disponibile): https://stackoverflow.com/a/11156040/309483

Mi sono imbattuto in questo utile articolo sul calcolo del checksum.

" Calcolo dei checksum CRC in C ++ " nel sito Web di Dr.dobbs.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top