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

作者: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. go搭建beego框架 go安装bee报错 github.com/derekparker/delve@v1.4.0: parsing go.mod:

    go搭建beego框架 go安装bee报错 go使用beego框架的时候,需要安装bee,安装的时候遇到一些坑报错,这里跟大家分享一下,有助于快速安装bee,搭建好beego环境 1. 首先切换到go ...

  2. 解决UE4项目编辑器启动时出现LogLinker: Warning: Failed to load '/Game/FirstPersonBP/FirstPersonOverview': Can't find file.

    UE4版本:4.24.3源码编译版本 Windows10 + VS2019环境 LogLinker: Warning: Failed to load '/Game/FirstPersonBP/Firs ...

  3. 巩固javaweb第一天

    巩固内容: 实例解析 <!DOCTYPE html> 声明为 HTML5 文档 <html> 元素是 HTML 页面的根元素 <head> 元素包含了文档的元(me ...

  4. 试了下GoAsm

    在VC里我们: #include <windows.h> DWORD dwNumberOfBytesWritten; int main() { HANDLE hStdOut = GetSt ...

  5. 【c++】解析多文件编程的原理

    其实一直搞不懂为什么头文件和其他cpp文件之间的关系,今晚索性一下整明白 [c++]解析多文件编程的原理 a.cpp #include<stdio.h> int main(){ a(); ...

  6. 【swift】长按事件绑定,平移滑动事件+坐标获取

    为何把这两个事件归类在一起? 我后来才明白,iOS有一个手势事件(UiGestureRecognizer) 事件里有7个功能,不过我只试过前两个,也就是标题的这两个(长按.平移滑动) UILongPr ...

  7. OpenStack之二: 安装OpenStack的yum源及相关组件

    #: 在所有节点执行 [root@localhost ~]# yum install centos-release-openstack-stein -y #: 安装相关组件(只在管理端和计算几点安装) ...

  8. solr8.2

    https://www.cnblogs.com/carlosouyang/p/11352779.html

  9. Laravel框架角色、权限

    角色表结构如下: 权限表结构如下: 控制器代码: //递归查询权限列表 public function index(){ $data = ManagePermissionModel::query()- ...

  10. 2021 中国.NET开发者峰会近50场热点技术专题揭秘

    01 大会介绍  .NET Conf China 2021 是面向开发人员的社区峰会,基于 .NET Conf 2021的活动,庆祝 .NET 6 的发布和回顾过去一年来 .NET 在中国的发展成果展 ...