00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "crc32.h"
00023
00024 static uint32 crc_table[256] =
00025 {
00026 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419,
00027 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4,
00028 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07,
00029 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
00030 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856,
00031 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
00032 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4,
00033 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
00034 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3,
00035 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A,
00036 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599,
00037 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
00038 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190,
00039 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F,
00040 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E,
00041 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
00042 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED,
00043 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
00044 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3,
00045 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
00046 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A,
00047 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5,
00048 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010,
00049 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
00050 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17,
00051 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6,
00052 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615,
00053 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
00054 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344,
00055 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
00056 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A,
00057 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
00058 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1,
00059 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C,
00060 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF,
00061 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
00062 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE,
00063 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31,
00064 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C,
00065 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
00066 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B,
00067 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
00068 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1,
00069 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
00070 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278,
00071 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7,
00072 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66,
00073 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
00074 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605,
00075 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8,
00076 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B,
00077 0x2D02EF8D
00078 };
00079
00080 #define STEPCRC(crc,byte) crc = crc_table[((int)crc ^ (byte)) & 0xff] ^ (crc >> 8)
00081
00082 uint32 CRC32_Start(void)
00083 {
00084 return (~((uint32)0));
00085 }
00086
00087 uint32 CRC32_Finish(uint32 crc)
00088 {
00089 return (~crc);
00090 }
00091
00092 uint32 CRC32_AddByte(uint32 crc,uint8 b)
00093 {
00094 STEPCRC(crc,b);
00095 return(crc);
00096 }
00097
00098 uint32 CRC32_AddWord(uint32 crc,uint16 w)
00099 {
00100 uint8 *ptr;
00101 ptr = (uint8 *)&w;
00102 STEPCRC(crc,ptr[0]);
00103 STEPCRC(crc,ptr[1]);
00104 return(crc);
00105 }
00106
00107 uint32 CRC32_AddLong(uint32 crc,uint32 l)
00108 {
00109 uint8 *ptr;
00110 ptr = (uint8 *)&l;
00111 STEPCRC(crc,ptr[0]);
00112 STEPCRC(crc,ptr[1]);
00113 STEPCRC(crc,ptr[2]);
00114 STEPCRC(crc,ptr[3]);
00115 return(crc);
00116 }
00117
00118 uint32 CRC32_Array(const uint8 * buf,uint32 buflen)
00119 {
00120 uint32 crc = (~((uint32)0));
00121
00122 if (!buf ) return 0;
00123
00124 while( (buflen&0xF) != 0 )
00125 {
00126 STEPCRC(crc,*buf); buf++;
00127 buflen--;
00128 }
00129
00130 buflen>>=4;
00131
00132 while(buflen--)
00133 {
00134 STEPCRC(crc,*buf); buf++;
00135 STEPCRC(crc,*buf); buf++;
00136 STEPCRC(crc,*buf); buf++;
00137 STEPCRC(crc,*buf); buf++;
00138
00139 STEPCRC(crc,*buf); buf++;
00140 STEPCRC(crc,*buf); buf++;
00141 STEPCRC(crc,*buf); buf++;
00142 STEPCRC(crc,*buf); buf++;
00143
00144 STEPCRC(crc,*buf); buf++;
00145 STEPCRC(crc,*buf); buf++;
00146 STEPCRC(crc,*buf); buf++;
00147 STEPCRC(crc,*buf); buf++;
00148
00149 STEPCRC(crc,*buf); buf++;
00150 STEPCRC(crc,*buf); buf++;
00151 STEPCRC(crc,*buf); buf++;
00152 STEPCRC(crc,*buf); buf++;
00153 }
00154
00155 crc ^= 0xFFFFFFFF;
00156
00157 return crc;
00158 }
00159