最近在研究ZIP,其中涉及到CRC循环冗余校验,是对未压缩数据的CRC验证。CRC网上代码比较乱,整理了一个发一下。
# include <stdio.h> # include <string.h> typedef unsigned int uint ; uint POLYNOMIAL = 0xEDB88320 ; int have_table = 0 ; uint table[256] ; void make_table() { int i, j, crc ; have_table = 1 ; for (i = 0 ; i < 256 ; i++) for (j = 0, table[i] = i ; j < 8 ; j++) table[i] = (table[i]>>1)^((table[i]&1)?POLYNOMIAL:0) ; } uint crc32(uint crc, char *buff, int len) { if (!have_table) make_table() ; crc = ~crc; for (int i = 0; i < len; i++) crc = (crc >> 8) ^ table[(crc ^ buff[i]) & 0xff]; return ~crc; } int main () { char s[] = "aaaaaa"; printf("%08Xh\n", crc32(0, s, strlen(s))); return 0 ; }