libdap  Updated for version 3.17.0
crc.h
00001 /*
00002  * From Tom Distler
00003  * See http://tdistler.com/2011/06/22/crc32-a-simple-c-class
00004  */
00005 
00006 #ifndef CRC_H_
00007 #define CRC_H_
00008 
00009 static const uint32_t kCrc32Table[256] = {
00010     0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
00011     0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
00012     0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
00013     0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
00014     0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
00015     0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
00016     0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
00017     0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
00018     0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
00019     0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
00020     0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
00021     0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
00022     0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
00023     0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
00024     0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
00025     0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
00026     0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
00027     0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
00028     0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
00029     0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
00030     0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
00031     0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
00032     0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
00033     0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
00034     0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
00035     0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
00036     0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
00037     0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
00038     0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
00039     0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
00040     0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
00041     0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
00042     0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
00043     0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
00044     0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
00045     0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
00046     0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
00047     0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
00048     0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
00049     0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
00050     0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
00051     0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
00052     0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
00053     0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
00054     0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
00055     0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
00056     0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
00057     0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
00058     0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
00059     0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
00060     0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
00061     0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
00062     0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
00063     0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
00064     0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
00065     0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
00066     0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
00067     0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
00068     0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
00069     0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
00070     0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
00071     0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
00072     0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
00073     0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
00074 }; // kCrc32Table
00075 
00076 class Crc32
00077 {
00078 public:
00079     typedef uint32_t checksum;
00080 
00084     Crc32() { Reset(); }
00085 
00086     ~Crc32() throw() {}
00087 
00092     void Reset() { _crc = (uint32_t)~0; }
00093 
00098     void AddData(const uint8_t* pData, const uint32_t length)
00099     {
00100         uint8_t* pCur = (uint8_t*)pData;
00101         uint32_t remaining = length;
00102         for (; remaining--; ++pCur)
00103             _crc = ( _crc >> 8 ) ^ kCrc32Table[(_crc ^ *pCur) & 0xff];
00104     }
00105 
00110     checksum GetCrc32() const { return ~_crc; }
00111 
00112 private:
00113     uint32_t _crc;
00114 };
00115 
00116 #endif /* CRC_H_ */