学习网站建设要报班吗,wordpress home插件,河南省新闻出版局,受雇去建设网站类网站C语言CRC-16 IBM格式校验函数
CRC-16校验产生2个字节长度的数据校验码#xff0c;通过计算得到的校验码和获得的校验码比较#xff0c;用于验证获得的数据的正确性。基本的CRC-16校验算法实现#xff0c;参考#xff1a; C语言标准CRC-16校验函数。
不同厂家通过对输入数…C语言CRC-16 IBM格式校验函数
CRC-16校验产生2个字节长度的数据校验码通过计算得到的校验码和获得的校验码比较用于验证获得的数据的正确性。基本的CRC-16校验算法实现参考 C语言标准CRC-16校验函数。
不同厂家通过对输入数据前处理和输出数据后处理的方式不同又产生了不同的厂家校验函数这里介绍IBM格式的CRC-16校验函数。IBM格式对输入数据按照单个字节进行位反序。对于输出的校验码进行整体位反序。
正向算法
正向算法是符合标准CRC-16的计算理论从左向右计算也即计算过程中移位时向左移出。几种正向算法的实现如下
CRC-16 IBM格式校验函数一(8位输入数据格式64位装载计算)
#include stdio.h
#include stdlib.h
uint16_t PY_CRC_16_IBM(uint8_t *di, uint32_t len)
{uint32_t crc_poly 0x00018005; //X^16X^15X^21 total 17 effective bits. Computed total data shall be compensated 16-bit 0 before CRC computing.uint8_t *datain;uint64_t cdata 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(len2)/6;uint32_t cr(len2)%6;uint32_t j;datain malloc(len2);for(j0;jlen;j){datain[j] 0;for(uint8_t m0; m7; m){datain[j] | ( ( di[j](7-m) ) 1 ) m;}}datain[len] 0; datain[len1] 0;//Compensate 16-bit 0 for input dataif(len6) //Mount data for only one segment{for(j0;j(len1);j){cdata (cdata8);cdata cdata|datain[j];}cn 1;}else{if(cr0){cr 6;}else if(cr1){cr 7;}else if(cr2){cr 8;}else{cn;}for(j0;jcr;j){cdata (cdata8);cdata cdata|datain[j];}}do{cn--;while(index_t0){if( (cdataindex_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 n1;n17;n){if ((data_t(16-n))1) {rec n;break;}if (n16) rec17;}if((index-16)rec){data_t data_t(index-16);data_t | (uint32_t)((cdata(64-(index-16)))(64-(index-16)));index 0x5555;}else{for(uint8_t i1;irec;i){data_t (data_t1)|((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(index0x5555) break;}else{index_t--;if(index_t16) break;}}if(cn0) //next segment{cdata data_t0x00ffff;for(uint8_t k0;k6;k){cdata (cdata8);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(cn0);free(datain);uint16_t i_data_t 0;for(uint8_t n0; n15; n){i_data_t | ( ( data_t(15-n) ) 1 ) n;}return i_data_t;
}CRC-16 IBM格式校验函数二8位输入数据格式
uint16_t PY_CRC_16_S_IBM(uint8_t *di, uint32_t len)
{uint16_t crc_poly 0x8005; //X^16X^15X^21 total 16 effective bits without X^16. Computed total data shall be compensated 16-bit 0 before CRC computing.uint32_t clen len2;uint8_t cdata[clen] ;for(uint32_t j0;jlen;j){cdata[j] 0;for(uint8_t m0; m7; m){cdata[j] | ( ( di[j](7-m) ) 1 ) m;}}cdata[len]0; cdata[len1]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_t0x8000)data_t ( (data_t1) | ( (cdata[i](7-j))0x01) ) ^ crc_poly;elsedata_t ( (data_t1) | ( (cdata[i](7-j))0x01) ) ;}}uint16_t i_data_t 0;for(uint8_t n0; n15; n){i_data_t | ( ( data_t(15-n) ) 1 ) n;}return i_data_t;
}CRC-16 IBM格式校验函数三16位输入数据格式
uint16_t PY_CRC_16_T16_IBM(uint16_t *di, uint32_t len)
{uint16_t crc_poly 0x8005; //X^16X^15X^21 total 16 effective bits without X^16. Computed total data shall be compensated 16-bit 0 before CRC computing.uint16_t data_t 0; //CRC registeruint16_t cdata[len];for(uint32_t j0;jlen;j){cdata[j] 0;for(uint8_t m0; m7; m){cdata[j] | ( ( ( (di[j]8)(7-m) ) 1 ) m ) | ( ( ( ( (di[j]0x00ff)(7-m) ) 1 ) m ) 8 );}}for(uint32_t i 0; i len; i){data_t ^ cdata[i]; //16-bit datafor (uint8_t j 0; j 16; j){if (data_t 0x8000)data_t (data_t 1) ^ crc_poly;elsedata_t 1;}}uint16_t i_data_t 0;for(uint8_t n0; n15; n){i_data_t | ( ( data_t(15-n) ) 1 ) n;}return i_data_t;
}CRC-16 IBM格式校验函数四8位输入数据格式
uint16_t PY_CRC_16_T8_IBM(uint8_t *di, uint32_t len)
{uint16_t crc_poly 0x8005; //X^16X^15X^21 total 16 effective bits without X^16. Computed total data shall be compensated 16-bit 0 before CRC computing.uint16_t data_t 0; //CRC registeruint8_t cdata[len];for(uint32_t j0;jlen;j){cdata[j] 0;for(uint8_t m0; m7; m){cdata[j] | ( ( di[j](7-m) ) 1 ) m;}}for(uint32_t i 0; i len; i){data_t ^ cdata[i]8; //8-bit datafor (uint8_t j 0; j 8; j){if (data_t 0x8000)data_t (data_t 1) ^ crc_poly;elsedata_t 1;}}uint16_t i_data_t 0;for(uint8_t n0; n15; n){i_data_t | ( ( data_t(15-n) ) 1 ) n;}return i_data_t;
}反向算法
反向算法是从由右向左计算也即计算过程中移位时向右移出。而计算过程中的输入数据高优先计算位和校验参数的对齐关系不变。因此把一个字节放在CRC计算寄存器的最低字节时对于IBM格式最右侧最低位实际上是高优先计算位而校验参数要相应倒序从而计算位置对照关系不变。
CRC-16 IBM格式校验函数五反向算法8位输入数据格式
uint16_t PY_CRC_16_T8_IBM_i(uint8_t *di, uint32_t len)
{uint16_t crc_poly 0xA001; //Bit sequence inversion of 0x8005uint16_t data_t 0; //CRC registerfor(uint32_t i 0; i len; i){data_t ^ di[i]; //8-bit datafor (uint8_t j 0; j 8; j){if (data_t 0x0001)data_t (data_t 1) ^ crc_poly;elsedata_t 1;}}return data_t;
}算法验证
5种算法结果相同 通过在线CRC工具对照验证成功
–End–