home *** CD-ROM | disk | FTP | other *** search
- // +++Date last modified: 05-Jul-1997
-
- /*
- ** CRC Calculator by Paul Johnston
- ** Version 1.0 Copyright 10/9/96 (September)
- ** Explicitly released to the public domain 30-Oct-1996 by the author
- */
-
- #include "crc.hpp"
-
- unsigned long Reflect(unsigned long toref, char w)
- {
- unsigned long v=0;
-
- for (int i = 1; i < (w + 1); i++)
- {
- if (toref & 1L)
- v |= 1L << (w-i);
- toref>>=1;
- }
- return v;
- }
-
-
- unsigned long CrcCalc::Add (unsigned long crc, char *sCrc)
- {
- crc^=crxo;
- if (fcrr)
- {
- while (*sCrc)
- crc = (crc >> 8) ^ acrpt[(crc & 0xFF) ^ *sCrc++];
- }
- else
- {
- while (*sCrc)
- crc = (crc << 8) ^ acrpt[((crc>>(crwd-8))&0xFF) ^ *sCrc++];
- }
- return (crc^crxo)&(-1l>>(32-crwd));
- }
-
- unsigned long CrcCalc::Add (unsigned long crc, PData sCrc)
- {
- crc^=crxo;
- if (fcrr)
- {
- while (sCrc.l--)
- crc = (crc >> 8) ^ acrpt[(crc & 0xFF) ^
- *((unsigned char *)sCrc.pData)++];
- }
- else
- {
- while (sCrc.l--)
- crc = (crc << 8) ^ acrpt[((crc>>(crwd-8))&0xFF) ^
- *((unsigned char *)sCrc.pData)++];
- }
- return (crc^crxo)&(-1l>>(32-crwd));
- }
-
- unsigned long CrcCalc::Add (unsigned long crc, unsigned char sCrc)
- {
- crc^=crxo;
- if (fcrr)
- crc = (crc >> 8) ^ acrpt[(crc & 0xFF) ^ sCrc];
- else crc = (crc << 8) ^ acrpt[((crc>>(crwd-8))&0xFF) ^ sCrc];
- return (crc^crxo)&(-1l>>(32-crwd));
- }
-
- unsigned long CrcCalc::Init()
- {
- return fcrr ? Reflect(crgi, crwd)^crxo : crgi^crxo;
- }
-
- CrcCalc::CrcCalc (Crst crst)
- {
- switch(crst)
- {
- case Crc16: InitCalc (0x1021l, 0xFFFFl, 0l, 0, 16); break;
- case Crc32: InitCalc (0x04C11DB7l, -1l, -1l, 1, 32); break;
- case JamCrc: InitCalc (0x04C11DB7l, -1l, 0l, 1, 32); break;
- case XModemCrc: InitCalc (0x8408l, 0l, 0l, 1, 16); break;
- case ZModemCrc16: InitCalc (0x1021l, 0l, 0l, 0, 16); break;
- case ZModemCrc32: InitCalc (0x04C11DB7l, -1l, -1l, 1, 32); break;
- }
- }
-
- CrcCalc::CrcCalc (unsigned long crpNew,
- unsigned long crgiNew,
- unsigned long crxoNew,
- unsigned char fcrrNew,
- unsigned char crwdNew)
- {
- InitCalc (crpNew, crgiNew, crxoNew, fcrrNew, crwdNew);
- }
-
- void CrcCalc::InitCalc (unsigned long crpNew,
- unsigned long crgiNew,
- unsigned long crxoNew,
- unsigned char fcrrNew,
- unsigned char crwdNew)
- {
- crp=crpNew;
- crgi=crgiNew;
- crxo=crxoNew;
- fcrr=fcrrNew;
- crwd=crwdNew;
-
- // Calculate look-up table
-
- for (unsigned long i = 0; i <= 0xFF; i++)
- {
- acrpt[i]=(fcrr ? Reflect(i,8) : i)<<(crwd-8);
- for (unsigned long j = 0; j < 8; j++)
- acrpt[i]=(acrpt[i]<<1)^(acrpt[i]&(1l<<(crwd-1)) ? crp : 0);
- if (fcrr) acrpt[i]=Reflect(acrpt[i],crwd);
- }
- }
-