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 ...
随机推荐
- Codeforces 1270H - Number of Components(线段树)
Codeforces 题目传送门 & 洛谷题目传送门 首先需发现一个性质,那就是每一个连通块所对应的是一个区间.换句话说 \(\forall l<r\),若 \(l,r\) 在同一连通块 ...
- 你不知道的iostat
1. 作用 iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视.它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况 ...
- perl中tr的用法(转载)
转载:http://blog.sina.com.cn/s/blog_4a0824490101hncz.html (1)/c表示把匹配不上的字符进行替换. $temp="AAAABCDEF&q ...
- Python time&datetime模块
1.time&datetime模块 time&datetime是时间模块,常用以处理时间相关问题 time.time() #返回当前时间的时间戳timestamp time.sleep ...
- MySQL插入大量数据探讨
笔者想进行数据库查询优化探索,但是前提是需要一个很大的表,因此得先导入大量数据至一张表中. 准备工作 准备一张表,id为主键且自增: 方案一 首先我想到的方案就是通过for循环插入 xml文件: &l ...
- Erda 1.1 版本发布|3 大亮点特性最新解读
来源|尔达 Erda 公众号 Erda v1.1 Changelog: https://github.com/erda-project/erda/blob/master/CHANGELOG/CHA ...
- Kafka入门教程(一)
转自:https://blog.csdn.net/yuan_xw/article/details/51210954 1 Kafka入门教程 1.1 消息队列(Message Queue) Messag ...
- Vue面试专题(未完)
1.谈一下你对MVVM原理的理解 传统的 MVC 指的是,用户操作会请求服务端路由,路由会调用对应的控制器来处理,控制器会获取数 据.将结果返回给前端,页面重新渲染. MVVM :传统的前端会将数 ...
- Hibernate持久化标志符生成策略
generator子元素定义持久化标识符的生成策略,为持久化类对应的数据库表的主键找到了赋值方法,HIbernate默认将使用assigned的持久化标识符生成策略.关系型数据库的主键定义方式:(1) ...
- Oracle存储过程游标for循环怎么写
一.不带参数的游标for循环 首先编写存储过程的整体结构,如下: create or replace procedure test_proc is v_date date; --变量定义 begin ...