c++计算 char数组CRC算法
Posted pandamohist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++计算 char数组CRC算法相关的知识,希望对你有一定的参考价值。
我使用的OS:win7。
我使用的开发环境:VS2010 + sp1
算法源码:
unsigned int create_crc_2(unsigned char *parr, unsigned int parr_len) unsigned char *pbuf = NULL; // 数据长度为奇数,在数据前补0 if (1 == parr_len % 2) parr_len += 1; pbuf = new(std::nothrow) unsigned char[parr_len]; memset(pbuf, 0, parr_len); memcpy(&pbuf[1], parr, parr_len - 1); // 数据长度为偶数,原样复制数据 else pbuf = new(std::nothrow) unsigned char[parr_len]; memcpy(pbuf, parr, parr_len); // CRC为用来移位的32位数据结构,ploy为32位的生成多项式 unsigned long crc = 0, ploy = 0; // CRC余数值 unsigned int crc_code = 0; int i = 0, j = 0, k = 0; // crc = 0xFFFF0000 // crc校验初始值为0 crc = 0; ploy = 0x80000000; // 求得32位的生成多项式 ploy = ploy ^ ((unsigned long)PLOYNOMAL << 15); // for (i = 0; i < 2; i++) 实现编码前预置移位寄存器全为1 // 先讲数据项的前16位放入crc中 crc = ((unsigned long)pbuf[0] << 24) ^ ((unsigned long)pbuf[1] << 16); // 该循环实现数据的移位,计算CRC余数 for (i = 2; i < (int)parr_len + 1; i += 2) // 判断pbuf数据项是否移位完毕 if (i < (int)parr_len) // 如果没有移位完毕,则移入pbuf[i]、pbuf[i+1] crc = crc ^ ((unsigned long)pbuf[i] << 8) ^ ((unsigned long)pbuf[i + 1]); // 移位完毕,则移入0000 到 CRC的低16位 else // 由于必须从数据项的第一位为“1”的位开始移位,必须要舍去数据项第一位为“1”的位置前所有的0 crc = crc & 0xFFFF0000; if (2 == i) // 舍0 while ( !(crc & 0x80000000) ) crc = crc << 1; // K为舍去的0的个数 k = k + 1; if (0 == crc) break; // 由于舍去K个0, 因此只需进行16-K次移位 for (j = 0; j < (16 - k); j ++) // 判断移出的是否为1 if (crc & 0x80000000) crc = ((crc ^ ploy) << 1); else crc = crc << 1; else for (j = 0; j < 16; j ++) // 判断移出的是否为1 if (crc & 0x80000000) crc = ((crc ^ ploy) << 1); else crc = crc << 1; crc_code = (unsigned int)(crc >> 16); // 清除缓冲 if (NULL != pbuf) delete [] pbuf; pbuf = NULL; // 返回计算结果 return crc_code;
以上是关于c++计算 char数组CRC算法的主要内容,如果未能解决你的问题,请参考以下文章
谁会crc16-ccitt的计算方法,用winform做的,谢谢啦。。。