00001 #include "crc32.h" 00002 00003 unsigned int crctab[] = { 00004 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 00005 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005, 00006 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61, 00007 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 00008 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 00009 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75, 00010 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 00011 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd, 00012 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039, 00013 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 00014 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81, 00015 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d, 00016 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 00017 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95, 00018 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 00019 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 00020 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae, 00021 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072, 00022 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 00023 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 00024 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde, 00025 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 00026 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066, 00027 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba, 00028 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 00029 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692, 00030 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6, 00031 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 00032 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e, 00033 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 00034 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 00035 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a, 00036 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637, 00037 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 00038 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 00039 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53, 00040 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 00041 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b, 00042 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff, 00043 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 00044 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 00045 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b, 00046 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 00047 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3, 00048 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 00049 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 00050 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f, 00051 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3, 00052 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 00053 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 00054 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8, 00055 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 00056 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30, 00057 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec, 00058 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 00059 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 00060 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0, 00061 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 00062 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18, 00063 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 00064 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 00065 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c, 00066 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668, 00067 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4 00068 }; 00069 00070 unsigned int crc32_initial(unsigned char *data, int len) 00071 { 00072 unsigned int result = 0; 00073 int i; 00074 00075 if (len < 4) { 00076 switch (len) { 00077 case 3: 00078 result = result << 8 | *data++; 00079 case 2: 00080 result = result << 8 | *data++; 00081 case 1: 00082 result = result << 8 | *data++; 00083 } 00084 return result; 00085 } 00086 00087 result = *data++ << 24; 00088 result |= *data++ << 16; 00089 result |= *data++ << 8; 00090 result |= *data++; 00091 result = ~ result; 00092 len -=4; 00093 00094 for (i=0; i<len; i++) 00095 { 00096 result = (result << 8 | *data++) ^ crctab[result >> 24]; 00097 } 00098 00099 return ~result; 00100 } 00101 00102 unsigned int crc32_update(unsigned char *data, int len, unsigned int previous) { 00103 unsigned int result = ~ previous; 00104 int i; 00105 00106 for (i=0; i<len; i++) { 00107 result = (result << 8 | *data++) ^ crctab[result >> 24]; 00108 } 00109 00110 return ~result; 00111 } 00112 00113 static unsigned char checksum3[4] = {0, 0, 0, 0xFF}; 00114 static unsigned char checksum_array[7] = {0xFF, 0xFF, 0xFF, 0, 0, 0, 0}; 00115 00116 unsigned int checksum_update(unsigned char *data, int len, unsigned int previous) { 00117 unsigned int result = previous; 00118 int i; 00119 unsigned int *ptr = (unsigned int *)data; 00120 int size = len >> 2; 00121 for (i=0; i<size; ++i) result ^= *ptr++; 00122 result ^= *ptr & *(unsigned int*)&(checksum_array[3-(len&3)]); 00123 return result; 00124 } 00125 00126 unsigned int checksum_initial(unsigned char *data, int len) { 00127 return checksum_update(data, len, 0); 00128 }