c++计算 char数组CRC算法
!!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!!
作者: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算法的更多相关文章
- 那些有关求解next数组的算法
next数组的历史 有关字符串的模式匹配算法中,比较容易写出的是朴素的匹配算法也就是一种暴力求解方式,但是由于其时间复杂度为子串长度和主串长度的乘积,例如strlen(subStr) = n,strl ...
- 计算字符数组长度,用strlen 与 sizeof 的原理与区别
遇到个坑,定义了一个字符数组 unsigned ;i<;i++) { buff[i] = ; } 然后用串口发送函数: write(fd, buff, strlen(buff)); 却发现串口一 ...
- CRC算法及C实现
一.CRC算法原理 CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校 验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数 ...
- QCryptographicHash实现哈希值计算,支持多种算法
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QCryptographicHash实现哈希值计算,支持多种算法 本文地址:http: ...
- C++ char数组和string类简单使用总结
使用char数组,进行字符串的操作,是c风格的操作方式. string是C++的风格,感觉string本质上就是一个vector<char> 以下代码详细展示了字符串的常见操作 #incl ...
- 循环冗余检验 (CRC) 算法原理
Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误. 算法原理 假设数据传输过程中需要发送15位的二进制信息g=10100 ...
- [C]编译器对char数组声明的一个行为
1概述 如果使用char[]来声明char数组,那么编译器会自动计算后面的字面量字符数,再加上一个空字符,作为它的长度.实际上这个数组最后一位被编译器强行加上了\0: #include <std ...
- C语言中,当计算字符数组长度时,用sizeof 和strlen 的原理及两者的区别
字符数组的长度计算:必须以终止符’\0'作为边界,但对字符数组赋值时,有两种方式: 1:定义时用字符初始化 (1)char chs[7] = {'a', 'c', '0', 'z', '3','d'} ...
- 字符串(一):char 数组
字符串使用方法整理 系列: 字符串(一):char 数组 字符串(二):string 1. 声明 如下是一个例子(=> 表示表达式等价): char a[20] = "abcd&quo ...
随机推荐
- 洛谷 P7718 -「EZEC-10」Equalization(差分转化+状压 dp)
洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\ ...
- LeeCode刷题笔记
(本来想在LeeCode题目页面上做注释的,结果没找到位置,只好来这里了) 字符串部分: 14.最长公共前缀:编写一个函数来查找字符串数组中的最长公共前缀. 示例 1: 输入: ["flow ...
- pcm-pcie 解析
简介 pcm 全称为 Performance Counter Monitor,该项目是针对 intel 平台处理器的资源利用率进行监控的工具.在现代 Intel 处理器已经提供了监视处理器内部性能事件 ...
- 【R】行或列数目不同的两个数据框如何用rbind/cbind合并?
目录 前言 方法一:dplyr的bind_rows 方法二:plyr的rbind.fill 前言 通常我们用rbind和cbind合并相同行列的数据框.当两个数据框具有不同行列数目时,直接用会报错. ...
- 【百奥云GS专栏】全基因组选择之模型篇
目录 1. 前言 2. BLUP方法 ABLUP GBLUP ssGBLUP RRBLUP 3. 贝叶斯方法 BayesA BayesB BayesC/Cπ/Dπ Bayesian Lasso 4. ...
- 关于基因GO分析的DAVID简单使用
利用DAVID简单的进行GO富集度分析(这里只做简单的分析,即看基因是否存在在GO的三个过程里面) 比如我们有一组要分析的基因:TRPV6 CXADR PROM1 GRAMD2 ...
- python 多行对应元素求和
今天有个统计需求,需要对应的元素的列求和,文件示例如下: 1 ID1 0 2 7 2 ID2 1 5 6 3 ID3 2 2 6 4 ID4 1 6 0 5 ID2 3 8 3 6 ID2 0 8 3 ...
- Python time&datetime模块
1.time&datetime模块 time&datetime是时间模块,常用以处理时间相关问题 time.time() #返回当前时间的时间戳timestamp time.sleep ...
- Vue 前端配置多级目录实践(基于Nginx配置方式)
前情提要 有阵子没更新博客了,因为快年结了工作比较多,这不,最近公司的对外演示环境出现问题这个活儿也落到了我的头上-- 事情是这样的,原来演示环境有很多服务,每个服务都是对外单独开一个端口,比如 ht ...
- LoadRunner中怎么设置密码参数化与用户名关联
对密码参数化时从parameter里的"Select next row"列表中选择Same Line As这一选项,意思就是每一个密码参数化取值与对应行的用户名关联起来了