C语言CRC-16 XMODEM格式校验函数

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的计算理论,从左向右计算,也即计算过程中移位时,向左移出 。几种正向算法的实现如下:

C语言CRC-16 XMODEM格式校验函数

文章插图
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位输入数据格式):