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;
}

  

原文地址:https://www.cnblogs.com/pandamohist/p/11089116.html

时间: 2024-08-16 19:56:30

c++计算 char数组CRC算法的相关文章

那些有关求解next数组的算法

next数组的历史 有关字符串的模式匹配算法中,比较容易写出的是朴素的匹配算法也就是一种暴力求解方式,但是由于其时间复杂度为子串长度和主串长度的乘积,例如strlen(subStr) = n,strlen(mainStr) = m,则其时间复杂度为O(mn). 为了能够得到更有效的匹配算法,D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特--莫里斯--普拉特操作(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达

C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别

字符数组的长度计算:必须以终止符'\0'作为边界,但对字符数组赋值时,有两种方式: 1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'}; // 长度为6 上式等价于: (2)char chs[7] = {'a', 'c', '0', 'z', '3','d', '/0'}; // 长度为6 也等价于: (3)char chs[] = {'a', 'c', '0', 'z', '3','d', '/0' }; // 长度为6 但不等

集合框架之数组集合算法

如何检测程序的健康程度? 如果想要知道程序运行所占的CPU和内存的情况可以使用飞行器,这样就可以知道程序的稳定性了.在JDK的bin目录下可以找到飞行器.如下图: 数组集合算法: 1.数组与集合的区别和联系: 数组是有限存储(规定了数组长度就只能存储那么多值),而集合是无限存储,但其实集合也是由数组做成的. 2.数组集合算法的原理: 当向集合里面存储一个值时,集合里面会为其申请一个适当长度的数组来存储,第二次存储值时,如果数组的长度不足以存储第二次的值,就重新申请一个长一点的数组,先把原来的数组

C/C++ string和char数组对比

string是c++特有的,使用时需添加头文件#include<string> (一)#include<string.h>和#include<cstring>以及#include<string.h>区别 <string.h> <string.h>是C版本的头文件,包含比如strcpy.strcat之类的字符串处理函数. <cstring> 在C++标准化(1998年)过程中,为了兼容以前,标准化组织将所有这些文件都进行了新

javascript数组去重算法-----4(另一种写法)

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript数组去重算法-----3</title> 6 </head> 7 <body> 8 <script> 9 var arr = [1,1,2,2,3,2,2,3,3,1,1,4,4,5

char数组中除去某个元素

1 /* 2 本程序说明: 3 4 char数组中除去某个元素(其实就是strcpy源码的变形) 5 6 */ 7 #include <iostream> 8 #include <cassert> 9 #include <cstring> 10 using namespace std; 11 12 char * remove_char(char* src, int length, char c){ 13 char *dst=src; 14 char *res=dst;

个人理解的int数组和char数组

char数组中不论是一维还是二维的,在程序执行时每一块的分离依据都是以提供的起始地址到'\0'为一个处理的字符串.所以关于char[]的函数都是只提供相应起始地址作为形参就可以. char[]互相交换内容时不是用的=号,而是使用strcpy(a,b),其中a为"被赋值的"char[]的起始地址,b为"要赋的值"的char[]的起始地址.要修改其中的某个字符则可以使用=号 另外例如char* a="abcd"和char b[5]="abc

javascript数组去重算法-----4(另一种写法__2)

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript数组去重算法-----3</title> 6 </head> 7 <body> 8 <script> 9 var arr = [1,1,2,2,3,2,2,3,3,1,1,4,4,5

javascript数组去重算法-----5

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript数组去重算法-----3</title> 6 </head> 7 <body> 8 <script> 9 var arr = [1,1,2,2,3,2,2,3,3,1,1,4,4,5