查找表实现的CRC16

来源:互联网 发布:爱淘宝和淘宝的区别 编辑:程序博客网 时间:2024/06/05 05:10

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 = 0xFF00 & (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;}u_int16_t crc16_update2(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));Initial = ((Initial<<8) & 0xFF00) | (0x00FF & buf[i]);Initial ^= table[b];}for(i=0; i<2; ++i){b = (u_int8_t)(0xFF & (Initial >> 8));Initial = (Initial<<8) & 0xFF00;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); //0x7E55crc16_make_table(crc16_table,0x1021);crc16=crc16_update(crc16_table,0,buf,0,256);printf("crc16_update()=%04X\n",crc16);  //0x7E55crc16=crc16_update2(crc16_table,0,buf,0,256);printf("crc16_update2()=%04X\n",crc16);  //0x7E55return 0;}



0 0
原创粉丝点击