COMMENT CALCULER LE CRC EN 32 BITS ?

Signaler
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
-
Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/32844-comment-calculer-le-crc-en-32-bits

Messages postés
1100
Date d'inscription
jeudi 24 avril 2003
Statut
Membre
Dernière intervention
17 octobre 2012
3
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
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

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
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.
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
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.
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

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