home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 21 / CD_ASCQ_21_040595.iso / dos / prg / c / complzw / crc32.cpp < prev    next >
C/C++ Source or Header  |  1995-01-29  |  1KB  |  52 lines

  1. #include "crc32.h"
  2.  
  3.  
  4. CRC32::crc        CRC32::MASQUE            =    0xFFFFFFFF ;
  5. CRC32::crc        CRC32::POLYNOME        =  0xEDB88320 ;
  6. CRC32::crc        CRC32::TABLE[ 256 ]    = { 0L } ;
  7. unsigned char     CRC32::TABLE_OK        = 0 ;
  8.  
  9.  
  10. CRC32::CRC32()    :    CRC( MASQUE )
  11. //
  12. // Le constructeur de la classe génère une table de coefficients, une
  13. // fois pour toutes : la table est static, et sa construction valide
  14. // un booléen qui témoignera que ceci fut fait.
  15. {
  16.     construireTable() ;
  17. }
  18.  
  19.  
  20. void CRC32::construireTable()
  21. {
  22.     if( TABLE_OK )        // fut déjà construite
  23.         return ;
  24.                             // construction de la table (cf la littérature)
  25.                             // les détails m'échappent, autant qu'à vous
  26.                             // (sauf votre respect !)
  27.     for( unsigned i = 0 ; i < 256 ; ++i )
  28.     {
  29.         crc valeur = i ;
  30.         for( unsigned j = 8 ; j > 0 ; --j )
  31.         {
  32.             if( valeur & 1 )
  33.                 valeur = ( valeur >> 1 ) ^ POLYNOME ;
  34.             else
  35.                 valeur >>= 1 ;
  36.         }
  37.         TABLE[ i ] = valeur ;
  38.     }
  39.     TABLE_OK = 1 ;    // pour savoir que la table est construite
  40. }
  41.  
  42.  
  43. CRC32::crc CRC32::valeur( const unsigned char * tampon, unsigned n )
  44. //
  45. // Calcule le crc pour n octets commençant à l'adresse tampon.
  46. // Les détails de la formule furent trouvés dans la littérature.
  47. {
  48.     while( n-- != 0 )
  49.         CRC = ( ( CRC >> 8 ) & 0x00FFFFFF ) ^ TABLE[ 0xFF & ( ( unsigned int )CRC ^ ( unsigned int )( *tampon++ ) ) ] ;
  50.     return CRC ;
  51. }
  52.