查找表实现的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
- 查找表实现的CRC16
- CRC16的C语言实现
- crc16 直接计算的实现
- java实现的CRC16算法
- CRC16算法的Java实现
- VC++ CRC16的两种实现方法
- 继承自HashAlgorithm的CRC16实现
- CRC16几种实现方法的比较
- 基于MODBUS 协议的CRC16程序实现
- C#实现的CRC16位校验
- CRC16校验的c语言实现
- CRC16校验算法的Java实现
- CRC16算法实现
- CRC16算法Java实现
- CRC16校验算法实现
- CRC16校验算法实现
- CRC16校验算法实现
- JAVA实现CRC16算法
- 数学之路-sas备忘(10)
- wlw 配置
- hdu 5183 hash+前缀和
- 【很早以前的作品】3DDemo走迷宫
- Android基础笔记——HttpClient访问网络
- 查找表实现的CRC16
- ajax调用webservice
- 表连接
- PowerHA故障案例分析
- textView设置边框
- 等式构造(equation)清华推免生机考第三题
- C语言中注释、标识符以及关键字
- c语言内存分配
- Apache 2.4.12 下载与安装