home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DP Tool Club 21
/
CD_ASCQ_21_040595.iso
/
dos
/
prg
/
c
/
complzw
/
crc32.h
< prev
next >
Wrap
C/C++ Source or Header
|
1995-01-29
|
2KB
|
55 lines
#ifndef CRC32_H
#define CRC32_H
//////////////////////////////////////////////////////////////////////
// Cette classe calcule un CRC de 32 bits (donc dans un unsigned long).
// Les détails du calcul m'échappent et m'intéressent peu (valeur du
// masque, des coefficients de polynômes, etc). J'ai trouvé tout cela
// dans la littérature (peut-être bien dans "La compression de données"
// de Mark Nelson), en C, et l'ai simplement mis à la "sauce" C++ :
//
// - valeur (char) calcule le crc pour 1 caractère ;
// - valeur(char *, unsigned) calcule le crc pour un tampon d'octets
// de longueur passée en argument 2 ;
// - valeur() renvoie la valeur du dernier crc calculé ;
// - raz() réinitialise la valeur de crc détenue.
//////////////////////////////////////////////////////////////////////
///////////
class CRC32 {
///////////
public :
typedef unsigned long crc ; // alias plus parlant
CRC32 () ; // constructeur public
crc valeur ( unsigned char c ) ;
crc valeur ( const unsigned char *, unsigned ) ;
crc valeur () const { return CRC ; }
void raz () { CRC = MASQUE ; }
private :
static crc TABLE[ 256 ] ; // coefficients mystérieux (pour moi)
static unsigned char TABLE_OK ; // table déjà construite
static crc MASQUE ;
static crc POLYNOME ;
crc CRC ; // dernier crc calculé
static void construireTable() ;
} ;
inline CRC32::crc CRC32::valeur( unsigned char c )
//
// Formule reprise dans la littérature...
{
return ( ( CRC >> 8 ) & 0x00FFFFFF ) ^ TABLE[ 0xFF & ( ( unsigned int )CRC ^ ( unsigned int )c ) ] ;
}
#endif