home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / CRC.CPP < prev    next >
C/C++ Source or Header  |  1997-07-05  |  3KB  |  117 lines

  1. // +++Date last modified: 05-Jul-1997
  2.  
  3. /*
  4. **    CRC Calculator by Paul Johnston
  5. **    Version 1.0 Copyright 10/9/96 (September)
  6. **    Explicitly released to the public domain 30-Oct-1996 by the author
  7. */
  8.  
  9. #include "crc.hpp"
  10.  
  11. unsigned long Reflect(unsigned long toref, char w)
  12. {
  13.        unsigned long v=0;
  14.  
  15.        for (int i = 1; i < (w + 1); i++)
  16.        {
  17.              if (toref & 1L)
  18.                    v |= 1L << (w-i);
  19.              toref>>=1;
  20.        }
  21.        return v;
  22. }
  23.  
  24.  
  25. unsigned long CrcCalc::Add (unsigned long crc, char *sCrc)
  26. {
  27.       crc^=crxo;
  28.       if (fcrr)
  29.       {
  30.             while (*sCrc)
  31.                   crc = (crc >> 8) ^ acrpt[(crc & 0xFF) ^ *sCrc++];
  32.       }
  33.       else
  34.       {
  35.             while (*sCrc)
  36.                   crc = (crc << 8) ^ acrpt[((crc>>(crwd-8))&0xFF) ^ *sCrc++];
  37.       }
  38.       return (crc^crxo)&(-1l>>(32-crwd));
  39. }
  40.  
  41. unsigned long CrcCalc::Add (unsigned long crc, PData sCrc)
  42. {
  43.       crc^=crxo;
  44.       if (fcrr)
  45.       {
  46.             while (sCrc.l--)
  47.                   crc = (crc >> 8) ^ acrpt[(crc & 0xFF) ^
  48.                         *((unsigned char *)sCrc.pData)++];
  49.       }
  50.       else
  51.       {
  52.             while (sCrc.l--)
  53.                   crc = (crc << 8) ^ acrpt[((crc>>(crwd-8))&0xFF) ^
  54.                         *((unsigned char *)sCrc.pData)++];
  55.       }
  56.       return (crc^crxo)&(-1l>>(32-crwd));
  57. }
  58.  
  59. unsigned long CrcCalc::Add (unsigned long crc, unsigned char sCrc)
  60. {
  61.       crc^=crxo;
  62.       if (fcrr)
  63.             crc = (crc >> 8) ^ acrpt[(crc & 0xFF) ^ sCrc];
  64.       else  crc = (crc << 8) ^ acrpt[((crc>>(crwd-8))&0xFF) ^ sCrc];
  65.       return (crc^crxo)&(-1l>>(32-crwd));
  66. }
  67.  
  68. unsigned long CrcCalc::Init()
  69. {
  70.       return fcrr ? Reflect(crgi, crwd)^crxo : crgi^crxo;
  71. }
  72.  
  73. CrcCalc::CrcCalc (Crst crst)
  74. {
  75.       switch(crst)
  76.       {
  77.       case Crc16:       InitCalc (0x1021l,     0xFFFFl,  0l, 0, 16); break;
  78.       case Crc32:       InitCalc (0x04C11DB7l,     -1l, -1l, 1, 32); break;
  79.       case JamCrc:      InitCalc (0x04C11DB7l,     -1l,  0l, 1, 32); break;
  80.       case XModemCrc:   InitCalc (0x8408l,          0l,  0l, 1, 16); break;
  81.       case ZModemCrc16: InitCalc (0x1021l,          0l,  0l, 0, 16); break;
  82.       case ZModemCrc32: InitCalc (0x04C11DB7l,     -1l, -1l, 1, 32); break;
  83.       }
  84. }
  85.  
  86. CrcCalc::CrcCalc (unsigned long crpNew,
  87.                   unsigned long crgiNew,
  88.                   unsigned long crxoNew,
  89.                   unsigned char fcrrNew,
  90.                   unsigned char crwdNew)
  91. {
  92.       InitCalc (crpNew, crgiNew, crxoNew, fcrrNew, crwdNew);
  93. }
  94.  
  95. void CrcCalc::InitCalc (unsigned long crpNew,
  96.                         unsigned long crgiNew,
  97.                         unsigned long crxoNew,
  98.                         unsigned char fcrrNew,
  99.                         unsigned char crwdNew)
  100. {
  101.       crp=crpNew;
  102.       crgi=crgiNew;
  103.       crxo=crxoNew;
  104.       fcrr=fcrrNew;
  105.       crwd=crwdNew;
  106.  
  107.       // Calculate look-up table
  108.  
  109.       for (unsigned long i = 0; i <= 0xFF; i++)
  110.       {
  111.             acrpt[i]=(fcrr ? Reflect(i,8) : i)<<(crwd-8);
  112.             for (unsigned long j = 0; j < 8; j++)
  113.                   acrpt[i]=(acrpt[i]<<1)^(acrpt[i]&(1l<<(crwd-1)) ? crp : 0);
  114.             if (fcrr) acrpt[i]=Reflect(acrpt[i],crwd);
  115.       }
  116. }
  117.