59 votes

Mise en œuvre du CRC32 en C ou C++

Je recherche une implémentation de CRC32 en C ou C++ qui soit explicitement licenciée comme étant gratuite ou du domaine public. L'implémentation aquí semble sympa, mais la seule chose qu'il dit à propos de la licence est "code source", ce qui n'est pas suffisant. Je préférerais une licence non LGPL pour ne pas avoir à m'amuser avec une DLL (mon application est fermée). J'ai vu l'implémentation d'adler32 en zlib, mais je vérifie de petits morceaux de données, ce pour quoi adler n'est pas bon.

0 votes

Pourquoi pensez-vous qu'adler32 n'est pas bon pour les petits morceaux ?

4 votes

zlib.net/zlib_tech.html "Ainsi, si l'Adler-32 est utilisé sur une taille nettement inférieure à un kilo-octet, il sera nettement plus faible qu'un CRC-32 sur le même petit bloc.

1 votes

Vous l'avez déjà accepté, mais si vous voulez, je peux probablement extraire pour vous celui qu'ils utilisent dans le noyau linux assez facilement.

42voto

cjm Points 44090

En Archives du code source C de SNIPPETS a une Mise en œuvre du CRC32 qui est librement utilisable :

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

(Malheureusement, c.snippets.org semble être mort. Heureusement, le site Wayback Machine l'a archivé).

Afin de pouvoir compiler le code, vous devrez ajouter des définitions de type pour les éléments suivants BYTE comme un entier non signé de 8 bits et DWORD sous la forme d'un entier 32 bits non signé, ainsi que les fichiers d'en-tête crc.h & sniptype.h .

Le seul élément critique de l'en-tête est cette macro (qui pourrait tout aussi bien se trouver dans CRC_32.c) :

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

0 votes

Pour l'entrée [01,23,45,67,89,AB,CD,EF,01,23] cette mise en œuvre me donne 0x27809EA7 plutôt que le 0x3BF5092E que j'obtiens des calculateurs en ligne, de boost::crc et du moteur de script de mIRC. A première vue, je ne sais pas vraiment pourquoi.

7 votes

@LightnessRacesinOrbit, vous vous y prenez mal. J'obtiens 0x3BF5092E . Mes superbes compétences psychiques en matière de débogage me disent que 0x27809EA7 apparaît si vous initialisez oldcrc32 a 0 au lieu de 0xFFFFFFFF comme il se doit.

0 votes

@cjm : Vous avez tout à fait raison. Ta :)

32voto

NTDLS Points 1791

Je suis l'auteur du code source au lien spécifié. Bien que l'intention de la licence du code source ne soit pas claire (elle le sera plus tard dans la journée), le code est en fait ouvert et gratuit pour une utilisation dans vos applications libres ou commerciales sans conditions.

1 votes

Hey Josh, c'est vraiment génial. Merci beaucoup d'avoir éclairci ce point. J'ai déjà fait l'objet d'une acquisition et ils étaient très pointilleux sur la licence de chaque morceau de code que j'utilisais.

6 votes

Si quelqu'un s'en préoccupe, votre code est meilleur que celui de boost... sur mes tests, 16s contre 25s en utilisant boost::crc_32_type

0 votes

Mais pour être juste, il a une distribution beaucoup plus uniforme que votre code...

26voto

Zan Lynx Points 23100

Utiliser le Bibliothèques C++ Boost . Il existe un CRC qui y est incluse et le licence est bonne.

31 votes

L'utilisation de boost est logique si vous utilisez déjà des bibliothèques boost. Sinon, c'est comme tirer avec un canon sur un oiseau - quelque chose que vous pouvez certainement faire, mais qui n'a aucun sens.

1 votes

@TarmoPikaro c'est un fichier d'en-tête, il suffit de le copier.

13 votes

include <boost/config.hpp> // pour BOOST_STATIC_CONSTANT, etc. #include <boost/integer.hpp> // pour boost::uint_t Les deux premières lignes entraînent deux fichiers d'en-tête supplémentaires ? Un marécage sans fin ?

19voto

Mark Adler Points 15178

Le code crc de zlib (http://zlib.net/) est l'un des plus rapides qui soient, et sa licence est très libérale.

Vous ne devriez pas utiliser adler-32, sauf pour des applications spéciales où la vitesse est plus importante que la performance de la détection d'erreurs.

6voto

therefromhere Points 21329

pycrc est un script Python qui génère du code CRC en C, avec des options permettant de sélectionner la taille, l'algorithme et le modèle du CRC.

Il est publié sous la licence MIT. Est-ce acceptable pour vous ?

4 votes

@i486, veuillez relire ma réponse - " qui génère un code CRC en C "La sortie de pycrc est un code source C.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X