标签:
http://www.w3.org/TR/PNG/#D-CRCAppendix
#include<stdio.h> #include<stdlib.h> #include<sys/types.h> /* * CRC16查找表生成 * table[256] : 存放查找表的数组 * Generator : 生成多项式,X^16+X^12+X^5+1,其生成多项式为0x1021 */ void crc16_make_table(u_int16_t table[256],const u_int16_t Generator) { u_int16_t c; int i,j,t1; for(i=0; i<256; ++i) { c = 0xFFFF & (i << 8); for(j=0; j<8; ++j) { t1 = c & 0x8000; c <<= 1; if(t1!=0) c ^= Generator; } table[i] = c; } } /* * CRC16校验 * table : crc16_make_table生成的查找表 * Generator : 生成多项式,X^16+X^12+X^5+1,其生成多项式为0x1021 * buf : 校验数据 * start : 数据起始位置 * length : 数据长度 * 返回值 : CRC16校验结果 */ u_int16_t crc16_update(const u_int16_t *table, u_int16_t Initial, const u_int8_t *buf, const int start, const int length) { u_int8_t b; int i; for(i=start; i<start+length; ++i) { b = (u_int8_t)(0xFF & (Initial >> 8)); b ^= buf[i]; Initial = 0xFF00 & (Initial << 8); Initial ^= table[b]; } return Initial; } /* * CRC16校验 * Initial : 存器初值 * Generator : 生成多项式,X^16+X^12+X^5+1,其生成多项式为0x1021 * buf : 校验数据 * start : 数据起始位置 * length : 数据长度 * 返回值 : CRC16校验结果 */ u_int16_t crc_16(u_int16_t Initial,const u_int16_t Generator,const u_int8_t *buf,const int start, const int length) { int i,j,t0,t1; u_int8_t b; for (i = start; i < start + length; ++i) { b = buf[i]; for (j = 0; j < 8; ++j) { t0 = b & 0x80; t1 = Initial & 0x8000; Initial <<= 1; b <<= 1; if (t0 != 0) Initial += 1; if (t1 != 0) Initial ^= Generator; } } for (i = 0; i < 16; ++i) { t1 = Initial & 0x8000; Initial <<= 1; if (t1 != 0) Initial ^= Generator; } return Initial; } int main() { int i; u_int16_t crc16; u_int8_t buf[256]; u_int16_t crc16_table[256]; for(i=0; i<256; ++i) buf[i]=(u_int8_t)(i&0xFF); crc16=crc_16(0,0x1021,buf,0,256); printf("crc_16()=%04X\n",crc16); //0x7E55 crc16_make_table(crc16_table,0x1021); crc16=crc16_update(crc16_table,0,buf,0,256); printf("crc16_update()=%04X\n",crc16); //0x7E55 return 0; }
标签:
原文地址:http://blog.csdn.net/adream307/article/details/44132313