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做的,谢谢啦。。。

CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现

CRC32算法笔记

CRC32加密算法的识别

crc16校验的c语言程序

CRC-16/MODBUS 算法