00001
00002
00003
00004
00005
00013 #ifndef HCRC_H
00014 #define HCRC_H
00015
00027 class HCRC : public HObj
00028 {
00029 typedef HObj base_class;
00030 static StringPtr ClassName(void) { return "HCRC"; }
00031
00032 private:
00033 enum { kAllOnes = 0xFFFFFFFFUL };
00034
00035
00036
00037 protected:
00038 uint32 m_uCRC;
00039
00040
00041
00042 public:
00043 HCRC(void)
00044 { Start(); }
00045 ~HCRC(void)
00046 { }
00047
00048
00049
00050 public:
00058 static ErrCode
00059 Compute(const HMemory & buffer, uint32 & uCRC)
00060 { return Compute( buffer.GetPtr(), buffer.GetSize(), uCRC); }
00069 static ErrCode
00070 Compute(PtrConst pData, uint32 uBytes, uint32 & uCRC)
00071 {
00072 ErrCode ec = HError::NoError();
00073
00074 uCRC = kAllOnes;
00075 ec = compute(reinterpret_cast<PtrDataConst>(pData), uBytes, uCRC);
00076 uCRC ^= kAllOnes;
00077
00078 return ec;
00079 }
00084 ErrCode
00085 Start(void)
00086 {
00087 m_uCRC = kAllOnes;
00088 return HError::NoError();
00089 }
00095 ErrCode
00096 Stop(uint32 & uCRC) const
00097 {
00098 uCRC = Get();
00099 return HError::NoError();
00100 }
00108 ErrCode
00109 Update(PtrConst pData, uint32 uBytes)
00110 { return compute(reinterpret_cast<PtrDataConst>(pData), uBytes, m_uCRC); }
00111
00112 protected:
00124 static ErrCode
00125 compute(PtrDataConst pData, uint32 uBytes, uint32 & uCRC)
00126 {
00127 const uint32 crcTable[256] =
00128 {
00129 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
00130 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
00131 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
00132 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
00133 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
00134 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
00135 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
00136 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
00137 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
00138 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
00139 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
00140 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
00141 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
00142 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
00143 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
00144 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
00145
00146 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
00147 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
00148 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
00149 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
00150 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
00151 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
00152 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
00153 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
00154 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
00155 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
00156 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
00157 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
00158 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
00159 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
00160 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
00161 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
00162
00163 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
00164 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
00165 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
00166 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
00167 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
00168 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
00169 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
00170 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
00171 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
00172 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
00173 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
00174 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
00175 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
00176 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
00177 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
00178 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
00179
00180 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
00181 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
00182 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
00183 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
00184 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
00185 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
00186 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
00187 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
00188 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
00189 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
00190 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
00191 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
00192 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
00193 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
00194 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
00195 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
00196 };
00197
00198 ErrCode ec = HError::NoError();
00199
00200 if (GOOD_PTR(pData) && uBytes > 0)
00201 {
00202 while (uBytes-- > 0)
00203 uCRC = (uCRC >> 8) ^ crcTable[(uCRC & 0xFF) ^ *pData++];
00204 }
00205 else if (uBytes > 0 && NULL_PTR(pData))
00206 ec = HError::Set(ERR_BAD_PARAMETER, __FILE__, __LINE__);
00207
00208 return ec;
00209 }
00210
00211
00212
00213 public:
00214 inline uint32 Get(void) const
00215 { return m_uCRC ^ kAllOnes; }
00216 };
00217
00218 #endif // HCRC_H
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245