!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!!

作者:mohist

我使用的OS:win7。

我使用的开发环境:VS2010 + sp1

算法源码:

 

  1 unsigned int create_crc_2(unsigned char *parr, unsigned int parr_len)
2 {
3 unsigned char *pbuf = NULL;
4
5 // 数据长度为奇数,在数据前补0
6 if (1 == parr_len % 2)
7 {
8 parr_len += 1;
9 pbuf = new(std::nothrow) unsigned char[parr_len];
10
11 memset(pbuf, 0, parr_len);
12 memcpy(&pbuf[1], parr, parr_len - 1);
13 }
14 // 数据长度为偶数,原样复制数据
15 else
16 {
17 pbuf = new(std::nothrow) unsigned char[parr_len];
18 memcpy(pbuf, parr, parr_len);
19 }
20
21 // 申请空间失败
22 if (NULL == pbuf)
23 {
24 return 0;
25 }
26
27 // CRC为用来移位的32位数据结构,ploy为32位的生成多项式
28 unsigned long crc = 0, ploy = 0;
29 // CRC余数值
30 unsigned int crc_code = 0;
31 int i = 0, j = 0, k = 0;
32
33 // crc = 0xFFFF0000
34 // crc校验初始值为0
35 crc = 0;
36 ploy = 0x80000000;
37 // 求得32位的生成多项式
38 ploy = ploy ^ ((unsigned long)PLOYNOMAL << 15);
39
40 // for (i = 0; i < 2; i++) 实现编码前预置移位寄存器全为1
41 // 先讲数据项的前16位放入crc中
42 crc = ((unsigned long)pbuf[0] << 24) ^ ((unsigned long)pbuf[1] << 16);
43
44 // 该循环实现数据的移位,计算CRC余数
45 for (i = 2; i < (int)parr_len + 1; i += 2)
46 {
47 // 判断pbuf数据项是否移位完毕
48 if (i < (int)parr_len)
49 {
50 // 如果没有移位完毕,则移入pbuf[i]、pbuf[i+1]
51 crc = crc ^ ((unsigned long)pbuf[i] << 8) ^ ((unsigned long)pbuf[i + 1]);
52 }
53 // 移位完毕,则移入0000 到 CRC的低16位
54 else
55 {
56 // 由于必须从数据项的第一位为“1”的位开始移位,必须要舍去数据项第一位为“1”的位置前所有的0
57 crc = crc & 0xFFFF0000;
58 }
59
60
61 if (2 == i)
62 {
63 // 舍0
64 while ( !(crc & 0x80000000) )
65 {
66 crc = crc << 1;
67 // K为舍去的0的个数
68 k = k + 1;
69
70 if (0 == crc)
71 break;
72 }
73
74 // 由于舍去K个0, 因此只需进行16-K次移位
75 for (j = 0; j < (16 - k); j ++)
76 {
77 // 判断移出的是否为1
78 if (crc & 0x80000000)
79 crc = ((crc ^ ploy) << 1);
80 else
81 crc = crc << 1;
82 }
83 }
84 else
85 {
86 for (j = 0; j < 16; j ++)
87 {
88 // 判断移出的是否为1
89 if (crc & 0x80000000)
90 crc = ((crc ^ ploy) << 1);
91 else
92 crc = crc << 1;
93 }
94 }
95 }
96
97 crc_code = (unsigned int)(crc >> 16);
98
99 // 清除缓冲
100 delete [] pbuf;
101 pbuf = NULL;
102
103 // 返回计算结果
104 return crc_code;
105 }

 

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

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

    next数组的历史 有关字符串的模式匹配算法中,比较容易写出的是朴素的匹配算法也就是一种暴力求解方式,但是由于其时间复杂度为子串长度和主串长度的乘积,例如strlen(subStr) = n,strl ...

  2. 计算字符数组长度,用strlen 与 sizeof 的原理与区别

    遇到个坑,定义了一个字符数组 unsigned ;i<;i++) { buff[i] = ; } 然后用串口发送函数: write(fd, buff, strlen(buff)); 却发现串口一 ...

  3. CRC算法及C实现

    一.CRC算法原理   CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校 验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数 ...

  4. QCryptographicHash实现哈希值计算,支持多种算法

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QCryptographicHash实现哈希值计算,支持多种算法     本文地址:http: ...

  5. C++ char数组和string类简单使用总结

    使用char数组,进行字符串的操作,是c风格的操作方式. string是C++的风格,感觉string本质上就是一个vector<char> 以下代码详细展示了字符串的常见操作 #incl ...

  6. 循环冗余检验 (CRC) 算法原理

    Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误. 算法原理 假设数据传输过程中需要发送15位的二进制信息g=10100 ...

  7. [C]编译器对char数组声明的一个行为

    1概述 如果使用char[]来声明char数组,那么编译器会自动计算后面的字面量字符数,再加上一个空字符,作为它的长度.实际上这个数组最后一位被编译器强行加上了\0: #include <std ...

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

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

  9. 字符串(一):char 数组

    字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string 1. 声明 如下是一个例子(=> 表示表达式等价): char a[20] = "abcd&quo ...

随机推荐

  1. iTOL进化树调图细节记录

    目录 1. 注册 2. 去枝长 3. 加图例 4. 无根树颜色 5. 导出图片 iTOL基本用法已经会了,之前记录过一点:系统发育(进化)树绘制小结.最近重用,调图时又发现了些细节,记录下备忘. 1. ...

  2. shell 脚本在linux中的应用

    shell脚本在linux中应用广泛,之前一直选用python写脚本来进行一些文件操作,但是最后发现shell脚本非常方便,所以特意来学习下皮毛,便于提高自己效率 定义变量 1 country=&qu ...

  3. Oracle、MySQL关机操作步骤

    一.Oracle数据库单机关机(eg:LEAP系统) 先关闭使用数据库的应用系统,再关闭数据库 关闭数据库执行以下命令 1.关闭Oracle数据库监听器:(使用操作系统下管理Oracle的账户,关闭监 ...

  4. 工作学习2-gcc升级引发的崩溃

    分享一下调查gcc 8.0下,函数漏写返回值崩溃问题,调查记录. 现在新的硬件,基本操作系统都是redhat 8.0,升级后测试时,发现了一个崩溃问题,记录一下. ================== ...

  5. C/C++ Qt 数据库与ComBox多级联动

    Qt中的SQL数据库组件可以与ComBox组件形成多级联动效果,在日常开发中多级联动效果应用非常广泛,例如当我们选择指定用户时,我们让其在另一个ComBox组件中列举出该用户所维护的主机列表,又或者当 ...

  6. day08 Nginx模块

    day08 Nginx模块 lnmp架构 l :Linux n :Nginx m :MySQL p :Python/PHP lnmp架构:是最简单的架构 Nginx中的模块(Python模块):前提是 ...

  7. Angular中怎样创建service服务来实现组件之间调用公共方法

    Angular组件之间不能互相调用方法,但是可以通过创建服务来实现公共方法的调用. 实现 创建服务命令 ng g service 服务路径/服务名 比如这里在app/services目录下创建stor ...

  8. 生成接口文档并同步到postman

    前言 当我们开发需要测试接口时,会遇到以下几个问题 1.如果接口过多,参数过多,一个个参数复制到postman简直能要了我的狗命,重复劳动过多. 2.如果接口过多,参数过多,编写接口文档给测试人员或者 ...

  9. IDEA 超实用使用技巧分享

    前言 工欲善其事 ​ 必先利其器 最近受部门的邀请,给入职新人统一培训IDEA,发现有很多新人虽然日常开发使用的是IDEA,但是还是很多好用的技巧没有用到,只是用到一些基本的功能,蛮浪费IDEA这个优 ...

  10. oracle(创建数据库对象)

    1 --创建数据库 2 --1.SYSDBA系统权限 3 startup:--启动数据库. 4 shutdown:--关闭数据库. 5 alter database[mount]|[open]|[ba ...