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

作者: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. C++常用的字符串处理函数-全

    这是自己用stl实现的一些字符串处理函数和常用的字符串处理技巧,经验正基本无误,可直接使用,若有问题,可相应列出 包括:split string to int int to string join # ...

  2. 28-Merge Two Sorted Lists

    easy 21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new l ...

  3. ubuntu 常用指令

    1.进入到root权限的指令 sudo su,效果同su,只是不需要root的密码,而需要当前用户的密码.(亲测有效) 2.从root权限里面退出到 普通用户模式 exit---指令亲测有效 3.下载 ...

  4. 对于vue项目更新迭代导致上传至服务器后出现Loading chunk {n} failed和Unexpected token <的解决方式

    相信大家对于vue项目的维护与更新中会遇见很多问题,其中有两种情况最为常见. 一种是Loading chunk {n} failed,这种情况出现的原因是vue页面更新上传至服务器后,由于vue默认打 ...

  5. Java事务与JTA

    一.什么是JAVA事务 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令.更简答的说就是:要么 ...

  6. 【编程思想】【设计模式】【其他模式】hsm

    Python版 https://github.com/faif/python-patterns/blob/master/other/hsm/hsm.py """ Impl ...

  7. SQL优化原理

    SQL优化过程: 1,捕获高负荷的SQL语句-->2得到SQL语句的执行计划和统计信息--->3分析SQL语句的执行计划和统计信息--->4采取措施,对SQL语句进行调整.1找出高负 ...

  8. jquery总结和注意事项

    1.关于页面元素的引用通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用dom ...

  9. MyBatis(3):优化MyBatis配置文件

    一.连接数据库的配置单独放在一个properties文件中 1,创建一个database.properties driver=com.mysql.jdbc.Driver url=jdbc:mysql: ...

  10. Java Timestamp 类的使用

    很简单,我们可以这样声明 Timestamp ts=new Timestamp(new Date().getTime());这样我们就可以得到时间比较具体的一个类型转换!!! 在开发web应用中,针对 ...