c语言 x16 x15 x2 1,CRC算法原理及C语言实现
CRC算法原理及C语言实现
摘 要 本文从理论上推导出CRC算法实现原理,给出三种分别适应不同计算机或微控制器硬件环境的C语言程序。读者更能根据本算法原理,用不同的语言编写出独特风格更加实用的CRC计算程序。
关键词 CRC 算法 C语言
1 引言
循环冗余码CRC检验技术广泛应用于测控及通信领域。CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是CRC算法的问题。
这里将提供三种算法,它们稍有不同,一种适用于程序空间十分苛刻但CRC计算速度要求不高的微控制器系统,另一种适用于程序空间较大且CRC计算速度要求较高的计算机或微控制器系统,最后一种是适用于程序空间不太大,且CRC计算速度又不可以太慢的微控制器系统。 2 CRC简介
CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。
后,16位的CRC码产生的规则是先将要发送的二进制序列数左移16位(既乘以216)
再除以一个多项式,最后所得到的余数既是CRC码,如式(2-1)式所示,其中B(X)表示n位的二进制序列数,G(X)为多项式,Q(X)为整数,R(X)是余数(既CRC码)。
B(X) 216R(X) (2-1) =Q(X)+G(X)G(X)
求CRC码所采用模2加减运算法则,既是不带进位和借位的按位加减,这种加减运算实际上就是逻辑上的异或运算,加法和减法等价,乘法和除法运算与普通代数式的乘除法运算是一样,符合同样的规律。生成CRC码的多项式如下,其中CRC-16和CRC-CCITT产生16位的CRC码,而CRC-32则产生的是32位的CRC码。本文不讨论32位的CRC算法,有兴趣的朋友可以根据本文的思路自己去推导计算方法。
CRC-16:(美国二进制同步系统中采用) G(X)=X16+X15+X2+1 CRC-CCITT:(由欧洲CCITT推荐) G(X)=X16+X12+X5+1 CRC-32: G(X)=X32+X26+X23+X22+X16+X12+X11+X10+X8 +X7+X5+X4+X2+X1+1
接收方将接收到的二进制序列数(包括信息码和CRC码)除以多项式,如果余数为0,则说明传输中无错误发生,否则说明传输有误,关于其原理这里不再多述。用软件计算CRC码时,接收方可以将接收到的信息码求CRC码,比较结果和接收到的CRC码是否相同。
3 按位计算CRC
c语言 x16 x15 x2 1,CRC算法原理及C语言实现相关推荐
- CRC-16/MODBUS x16+x15+x2+1校验计算 C++
CRC-16/MODBUS x16+x15+x2+1校验计算 #include <stdio.h> int main(void) { unsigned short tmp = 0x ...
- CRC-16校验(多项式为x16+x15+x2+1):
CRC-16校验(多项式为x16+x15+x2+1): type {CRC校验} TDataByte = array of byte; const CRCHi: array [0..25 ...
- CRC算法原理及其Verilog实现
CRC算法原理及其Verilog实现 2015-03-19 21:28 688人阅读 评论(0) 收藏 举报 分类: FPGA基础知识(39) http://blog.163.com/f ...
- 【数据校验杂谈】循环冗余检验 (CRC) 算法原理
2019独角兽企业重金招聘Python工程师标准>>> 循环冗余检验 (CRC) 算法原理 Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于 ...
- 机器学习中的K-means算法原理与R语言实例
聚类是将相似对象归到同一个簇中的方法,这有点像全自动分类.簇内的对象越相似,聚类的效果越好.支持向量机.神经网络所讨论的分类问题都是有监督的学习方式,现在我们所介绍的聚类则是无监督的.其中,K均值(K ...
- 安全密码c语言编程,商用密码算法原理与C语言实现
2020年1月1日,<中华人民共和国密码法>正式施行.国家鼓励和支持密码科学技术研究与应用,促进密码科学技术进步与创新,加强密码人才培养和队伍建设,采取多种形式加强密码安全教育.本书是在国 ...
- 数据结构 算法与应用C 语言描述第六章,数据结构算法与应用-C语言描述002.pdf
下载 下载 第2 章 程 序 性 能 以下是本章中所介绍的有关程序性能分析与测量的概念: • 确定一个程序对内存及时间的需求. • 使用操作数和执行步数来测量一个程序的时间需求. • 采用渐进符号描述 ...
- c语言用CRC校验FCS序列,CRC校验原理与其C语言实现
CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+ r)位,最后发 ...
- 卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用
文章目录 卡尔曼滤波 一.滤波效果展示 二.简介 三.组成 1. 预测状态方程 (1)目的: (2)方程: (3)备注 2. 预测协方差方程 (1)目的 (2)方程 (3)备注 3. 卡尔曼增益方程 ...
最新文章
- NC:王金锋等揭示阴道菌群异位对子宫健康的影响
- 让SEQUENCE记录不变的信息【RECORD STATIC NUMBER IN SEQUENCE】
- C语言经典例20-小球反弹高度问题
- Visual Studio 11 Beta 带来新的Metro 应用开发体验
- html中两个冒号,css中双冒号和单冒号区别
- 数的直径(两次DFS)
- c# 找出目录下的所有子目录_C# 基础知识系列- 14 IO篇 文件的操作(2)
- mysql中字典值怎么添加_插入Python字典中的值,包括MySQL的键
- php的微信登录示例代码,网站微信登录实例代码
- python实现的简版iconv
- YII framework CComponent基础类解读(转)
- 李开复:一切靠命运或靠自己都是不合适的
- Linux下创建Django项目并访问
- python之os.listdir
- LINUX双击无法启动解决一例
- php 添加数据sql语句,PHP添加/修改/删除SQL语句
- python数据分析百度云资源_数据分析师视频教程百度云网盘下载
- golang not enough arguments in call to uuid.Must
- JavaScript名词shim与polyfill
- Android利用jsoup爬虫爬网页数据(一)