C语言CRC-16 格式校验函数
【C语言CRC-16 XMODEM格式校验函数】CRC-16校验产生2个字节长度的数据校验码,通过计算得到的校验码和获得的校验码比较,用于验证获得的数据的正确性 。基本的CRC-16校验算法实现,参考: C语言标准CRC-16校验函数 。
不同应用规范通过对输入数据前处理和输出数据后处理的方式不同,又产生了不同的应用规范校验函数,这里介绍格式的CRC-16校验函数 。实际上符合标准CRC-16计算过程,并无前处理和后处理,仅需注意生成多项式即可 。
生成多项式为x^16 + x^12 + x^5 + 1
由于反向算法更适合于有输入字节倒位序和输出整体数据倒位序的情况,这里只介绍正向算法 。
正向算法
正向算法是符合标准CRC-16的计算理论,从左向右计算,也即计算过程中移位时,向左移出 。几种正向算法的实现如下:
文章插图
CRC-16 格式校验函数一(8位输入数据格式,64位装载计算):
#include #include uint16_t PY_CRC_16_XMODEM(uint8_t *di, uint32_t len){uint32_t crc_poly = 0x00011021;//X^16+X^12+X^5+1 total 17 effective bits. Computed total data shall be compensated 16-bit '0' before CRC computing.uint8_t *datain;uint64_t cdata = http://www.kingceram.com/post/0; //Computed total datauint32_t data_t = 0; //Process data of CRC computinguint16_t index_t = 63;///bit shifting index for initial '1' searchinguint16_t index = 63;//bit shifting index for CRC computinguint8_t rec = 0; //bit number needed to be compensated for next CRC computinguint32_t cn=(len+2)/6;uint32_t cr=(len+2)%6;uint32_t j;datain = malloc(len+2);for(j=0;j0){if( (cdata>>index_t)&1 ){index = index_t;index_t = 0;data_t |= (cdata>>(index-16));{data_t = data_t ^ crc_poly;}while((index!=0x5555)&&(index!=0xaaaa)){for(uint8_t n=1;n<17;n++){if ((data_t>>(16-n))&1) {rec = n;break;}if (n==16) rec=17;}if((index-16)>(64-(index-16)));index = 0x5555;}else{for(uint8_t i=1;i<=rec;i++){data_t = (data_t<<1)|((cdata>>(index-16-i))&1) ;}if(rec!= 17){data_t = data_t ^ crc_poly;index -= rec;}else{data_t = 0;index_t = index-16-1;index = 0xaaaa;}}}if(index==0x5555) break;}else{index_t--;if(index_t<16) break;}}if(cn>0) //next segment{cdata = http://www.kingceram.com/post/data_t&0x00ffff;for(uint8_t k=0;k<6;k++){cdata = (cdata<<8);cdata = cdata|datain[j++];}data_t = 0;index_t = 63;///bit shifting index for initial '1' searchingindex = 63;//bit shifting index for CRC computingrec = 0; //bit number needed to be compensated for next CRC computing}}while(cn>0);free(datain);return (uint16_t)data_t;}
CRC-16 格式校验函数二(8位输入数据格式):
uint16_t PY_CRC_16_S_XMODEM(uint8_t *di, uint32_t len){uint16_t crc_poly = 0x1021;//X^16+X^12+X^5+1 total 16 effective bits without X^16. Computed total data shall be compensated 16-bit '0' before CRC computing.uint32_t clen = len+2;uint8_t cdata[clen] ;memcpy(cdata, di, len); cdata[len]=0; cdata[len+1]=0;uint16_t data_t = (((uint16_t)cdata[0]) << 8) + cdata[1]; //CRC registerfor (uint32_t i = 2; i < clen; i++){for (uint8_t j = 0; j <= 7; j++){if(data_t&0x8000)data_t = ( (data_t<<1) | ( (cdata[i]>>(7-j))&0x01) ) ^ crc_poly;elsedata_t = ( (data_t<<1) | ( (cdata[i]>>(7-j))&0x01) ) ;}}return data_t;}
CRC-16 格式校验函数三(16位输入数据格式):
- 下了个系统语言C盘爆了,语言包占用了大量的C盘空间Win7系统语言包如何卸载
- win7中文语言包环境下安装软件乱码的解决方法
- Web前端,各类语言…… 计算机类网络课程
- 动态数组怎么赋值,c语言数组动态赋值
- 【C语言】三剑客之《C陷井与缺陷》完整笔记
- 巴西说什么语言-巴西说什么语言葡萄牙语你好
- 马来西亚说什么语言
- 宁波外语培训
- 嵌入式系统语言常见算法解析,这12条准则一定要记住
- 传统基于Java,.NET等高级语言的定制开发模式你厌倦了?