begin process at 2012 05 27 14:42:01
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > COMMENT CALCULER LE CRC EN 32 BITS ?

COMMENT CALCULER LE CRC EN 32 BITS ?


 Information sur la source

Note :
Aucune note
Catégorie :Maths & Algorithmes Classé sous :crc, calcul, 32bits, ulong, crc32 Niveau :Initié Date de création :22/07/2005 Date de mise à jour :23/07/2005 17:22:33 Vu / téléchargé :21 930 / 1 022

Auteur : KyoKo

Ecrire un message privé
Site perso
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

Voici une classe permettant de calculer le crc d'un buffer de données en 32 bits. Simple d'utilisation, je l'ai construite de façon que les débutants puissent l'utiliser sans difficultés. Il suffit d'initialiser l'objet grâce à la méthode 'Init()' qui remplit un tableau permettant de gagner en temps machine, elle prend en paramètre le Polynome sous forme d' ULONG. Ensuite, il faut appeler la méthode 'GetCrc32()' pour récupérer le crc en ULONG.

Source

  • #include "Crc32.h"
  • int main(int argc, char *argv[])
  • {
  • // objet Crc32
  • Crc32 crc32;
  • // variable recevant le crc
  • ULONG Crc32;
  • // buffer des données
  • char buffer[] = "AZSEDV356484JF9O5?FPP4?ZYB2YUDNFIBLHPVN";
  • /* Initialisation de la table de l'objet Crc32,
  • le paramètre est le polynome à utiliser :
  • - CRC32_POLY_CCITTV41
  • - CRC32_POLY_CRC16
  • - CRC32_POLY_CRC12
  • - CRC32_POLY_ARPA
  • - CRC32_POLY_ETHERNET
  • - CRC32_POLY_WINZIP
  • Retourne 'false' si le polynome est invalide */
  • if (!crc32.Init( CRC32_POLY_CCITTV41 ))
  • {
  • printf( "crc32.Init() : Erreur !\n" );
  • return 0;
  • }
  • /* calcul du crc en 32 bits, le premier paramètre est un pointeur sur les données,
  • le second est la taille des données.
  • Retourne 0 si les paramètres sont invalides */
  • Crc32 = crc32.GetCrc32( buffer, 39 );
  • // affichage du crc
  • printf( "crc32 = %d\n", Crc32 );
  • return 0;
  • }
#include "Crc32.h"

int main(int argc, char *argv[])
{
	// objet Crc32
	Crc32	crc32;		
	
	// variable recevant le crc
	ULONG	Crc32;		

	// buffer des données
	char	buffer[] = "AZSEDV356484JF9O5?FPP4?ZYB2YUDNFIBLHPVN";

	/* Initialisation de la table de l'objet Crc32,
	le paramètre est le polynome à utiliser :
		
		- CRC32_POLY_CCITTV41		
		- CRC32_POLY_CRC16
		- CRC32_POLY_CRC12
		- CRC32_POLY_ARPA
		- CRC32_POLY_ETHERNET
		- CRC32_POLY_WINZIP

	Retourne 'false' si le polynome est invalide */

	if (!crc32.Init( CRC32_POLY_CCITTV41 ))
	{
		printf( "crc32.Init() : Erreur !\n" );
		return 0;
	}
	
	/* calcul du crc en 32 bits, le premier paramètre est un pointeur sur les données,
	 le second est la taille des données.	
	Retourne 0 si les paramètres sont invalides */

	Crc32 = crc32.GetCrc32( buffer, 39 );

	// affichage du crc
	printf( "crc32 = %d\n", Crc32 );
	
	return 0;
}

 Conclusion

Aucuns bugs connus !!!

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

23 juillet 2005 17:22:34 :
Optimisation du code, au niveau : - des variables - du buffer de données - de la gestion des erreurs

 Sources du même auteur

Source avec Zip Source avec une capture INTERFACE COMME DIRECTDRAW SOUS WIN32 AVEC LE GDI
PDC32: VOICI UNE DLL QUI PERMET DE LIRE DES FICHIERS DE CONF...
COMMENT GENERER UN CHIFFRE ALEATOIRE [DEV-C++]
COMMENT CREER DES RECTANGLES DE SELECTION [DEV-C++]
COMMENT RECUPERER LA RESOLUTION DE L'ECRAN [DEV-C++]

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

CALCUL DE CLEF RIB par Renfield
Source avec une capture CONVERTISSEUR par smartties
Source avec une capture CALCUL DE VARIANCE par Minilogus
Source avec une capture CALCUL D'INCERTITUDE par Minilogus
Source avec Zip Source avec une capture [C++] HASH FINDER - CALCULATEUR DE HASH par ordiman85

Commentaires et avis

Commentaire de xterminhate le 23/07/2005 09:19:15

Bonjour,

Pourquoi ulong alors que int suffit pour un nombre entier 32 bits ?

Tu pourrais éliminer init(), par l'appel du constructeur avec argument et lancer un exception si le polynome est invalide.

Tu pourrais également remplacer GetCrc() par une conversion implicite en int pour encore faciliter l'utilisation.

Cordialement,
X.

Commentaire de Clem le 23/07/2005 17:39:36

il me semble me rapeller que le ulong soit de 32 bits, qui a le courage de vérifier (il est définit dans quel .h ?)

par contre non l'int n'est pas bon il vaudrait mieux un unsigned int.

ça me parait utile comme classe, mais comment tu fait par exemple pour le crc16 sur une classe exclusive de crc32 ? :/

Commentaire de xterminhate le 23/07/2005 18:01:32

Exact, je voulais dire "unsigned int". Le lecteur aura corrigé de lui même.

Commentaire de DeAtHCrAsH le 24/07/2005 11:07:10

Sur les systèmes 32bits, les int et les longs, sont tous deux codés sur 32 bits. Il n'y a donc pas de différence entre ces derniers.

Commentaire de xterminhate le 24/07/2005 11:19:35

En faisant de Init() le constructeur et en réalisant la vérification du polynome à la compilation, voici une simplification du code Crc32 :

/***************************/

#include<cstring>
#include<string>
#include<iostream>
using namespace std;

struct Crc32
{
// Liste des polynomes autorisés :
enum Polynome
{
POLY_CCITTV41 = 0x88180000,
POLY_CRC16 = 0xC0028000,
POLY_CRC12 = 0xC0780000,
POLY_ARPA = 0xC1D79480,
POLY_ETHERNET = 0x8260EDB8,
POLY_WINZIP = 0x04C11DB7
};

// Constructeur / Selection du polynome
Crc32( Polynome const & poly )
{
for ( int i=0; i <= 0xFF; ++i )
{
crc32_table[i] = Reflect( i, 8 ) << 24;
for ( int j=0; j<8; ++j )
crc32_table[i] = (crc32_table[i] << 1) ^ (crc32_table[i] & (1<<31) ? poly : 0);
crc32_table[i] = Reflect( crc32_table[i], 32 );
}
}

// Calculateur de CRC selon le polynome choisi
unsigned int operator()( char const * const & buffer, unsigned int const & taille ) const
{
if (buffer==0 || taille ==0)
return 0;
unsigned int crc32 = 0xFFFFFFFF;
for( unsigned int i = 0; i < taille; ++i)
crc32 = ( crc32 >> 8 ) ^ crc32_table[ (crc32 & 0xFF) ^ buffer[i] ];
return crc32 ^ 0xFFFFFFFF;
}

private:

// Boite à outils
static unsigned int Reflect( unsigned int const & ref, int const & taille )
{
unsigned int value = 0;
for ( int i=0; i<taille; ++i )
value |= ( ( ref >> i ) & 0x0001 ) << ( taille - i - 1 );
return value;
}

// Table de calcul
unsigned int crc32_table[256];
};

int main()
{
string buffer ( "AZSEDV356484JF9O5?FPP4?ZYB2YUDNFIBLHPVN" );
// Création + Calcul du CRC du buffer
cout << "Crc = " << hex << uppercase << Crc32( Crc32::POLY_WINZIP )( buffer.c_str(), buffer.size() ) << endl;
// même chose au ralenti...
Crc32 crc32( Crc32::POLY_WINZIP );
unsigned int resultat_crc = crc32( buffer.c_str(), buffer.size() );
cout << "Crc = " << hex << uppercase << resultat_crc << endl;
}

/***************************/

Le code devient un peu plus C++ et un peu plus portable (GNU/Linux & Win) mais reste sans doute lié à une plateforme 32 bits (à tester avec un GCC sur une IA-64).

Cordialement,
X.

Commentaire de victorcoasne le 17/04/2007 10:40:17

Non int est aloué en fonction du processeur donc 64 bits si c'est un 64 bits, 32 bits si c'est un 32 bits....
Donc il conviendrait d'écrire :
  unsigned long
        ou
  unsigned long int

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

verif CRC16 [ par sena ] Bonjour,voila j'ai un pti prog pour calculer le CRC16.Je voudrai savoir si kelkun pouvait me dire si ce code fonctionne merci. Car je n'ai qu'un seul Algo de calcul d'un CRC16 [ par cestmat ] Bonjour,Je dois calculer un CRC avec le polynome utilisé dans HDLC (X^16 + X^12 + X^5 + 1).J'ai à peu prés compris le principe des CRC mais à chaque f Quel est ce langage? et qu'est-ce que cela veut dire? [ par romainstq ] Bonjour,je ne sais pas si je poste dans la bonne catégorie du forum, mais je souhaiterai savoir ce que vous pensez du code suivant et si les personnes calcul designature crc32 des fichiers [ par keila ] Bonjour à tous!!! Aidez moi à résoudre mon problème.Il m'a été demandé de mettre en place une application qui tournera sous windows et linux, qui devr Probleme de calcul d'une moyenne [ par jejehero ] Salut,J'ai commence la programmation il y a quelques mois et là je veux faire un calcul de moyenne, voici le programme :#include &lt;stdio.h&gt;#inclu ZwCreateObject [ par Willi ] Bonsoir,J'ai fais un petit driver afin de hooker ZwCreateFile. Il fonctionne sans problème.J'essais à présent de récupérer le nom du fichier ouvert av [CPP] calcul de la longueur du texte en fonction de la largeur du label [ par Titi035 ] Salut, J'ai un texte que je souhaite afficher dans un label. Si le texte est trop grand, j'aimerais qu'il soit tronqué et qu'il se termine par "...". Bibliothèque de calcul sur les polynômes [ par Nenex25 ] Bonjour à tout le monde, Je suis apprenti et j'apprends la programmation informatique. Je dois réaliser un mini projet sur une bibliothèque d CRC - Problème avec génération de solution en release [ par lolo_yeager ] Bonjour,J'utilise un logiciel (F-CRC Calculator) qui me calcul le CRC des éxecutables que j'ai géneré en release. Mais je viens de m'appercevoir d'une Calcul du squelette d'une forme 2D ou 3D [ par FiReTiTi ] Bonjour, je souhaiterai savoir si quelqu'un saurait où trouver du code qui calcule le squelette d'une forme 2D ou 3D. De préférence, des méthodes autr


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,310 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales