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语言实现相关推荐

  1. 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 ...

  2. CRC-16校验(多项式为x16+x15+x2+1):

    CRC-16校验(多项式为x16+x15+x2+1): type {CRC校验} TDataByte = array of byte; const        CRCHi: array [0..25 ...

  3. CRC算法原理及其Verilog实现

    CRC算法原理及其Verilog实现 2015-03-19 21:28  688人阅读  评论(0)  收藏  举报   分类: FPGA基础知识(39)  http://blog.163.com/f ...

  4. 【数据校验杂谈】循环冗余检验 (CRC) 算法原理

    2019独角兽企业重金招聘Python工程师标准>>> 循环冗余检验 (CRC) 算法原理 Cyclic Redundancy Check循环冗余检验,是基于数据计算一组效验码,用于 ...

  5. 机器学习中的K-means算法原理与R语言实例

    聚类是将相似对象归到同一个簇中的方法,这有点像全自动分类.簇内的对象越相似,聚类的效果越好.支持向量机.神经网络所讨论的分类问题都是有监督的学习方式,现在我们所介绍的聚类则是无监督的.其中,K均值(K ...

  6. 安全密码c语言编程,商用密码算法原理与C语言实现

    2020年1月1日,<中华人民共和国密码法>正式施行.国家鼓励和支持密码科学技术研究与应用,促进密码科学技术进步与创新,加强密码人才培养和队伍建设,采取多种形式加强密码安全教育.本书是在国 ...

  7. 数据结构 算法与应用C 语言描述第六章,数据结构算法与应用-C语言描述002.pdf

    下载 下载 第2 章 程 序 性 能 以下是本章中所介绍的有关程序性能分析与测量的概念: • 确定一个程序对内存及时间的需求. • 使用操作数和执行步数来测量一个程序的时间需求. • 采用渐进符号描述 ...

  8. c语言用CRC校验FCS序列,CRC校验原理与其C语言实现

    CRC校验码的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+ r)位,最后发 ...

  9. 卡尔曼(Kalman)滤波算法原理、C语言实现及实际应用

    文章目录 卡尔曼滤波 一.滤波效果展示 二.简介 三.组成 1. 预测状态方程 (1)目的: (2)方程: (3)备注 2. 预测协方差方程 (1)目的 (2)方程 (3)备注 3. 卡尔曼增益方程 ...

最新文章

  1. NC:王金锋等揭示阴道菌群异位对子宫健康的影响
  2. 让SEQUENCE记录不变的信息【RECORD STATIC NUMBER IN SEQUENCE】
  3. C语言经典例20-小球反弹高度问题
  4. Visual Studio 11 Beta 带来新的Metro 应用开发体验
  5. html中两个冒号,css中双冒号和单冒号区别
  6. 数的直径(两次DFS)
  7. c# 找出目录下的所有子目录_C# 基础知识系列- 14 IO篇 文件的操作(2)
  8. mysql中字典值怎么添加_插入Python字典中的值,包括MySQL的键
  9. php的微信登录示例代码,网站微信登录实例代码
  10. python实现的简版iconv
  11. YII framework CComponent基础类解读(转)
  12. 李开复:一切靠命运或靠自己都是不合适的
  13. Linux下创建Django项目并访问
  14. python之os.listdir
  15. LINUX双击无法启动解决一例
  16. php 添加数据sql语句,PHP添加/修改/删除SQL语句
  17. python数据分析百度云资源_数据分析师视频教程百度云网盘下载
  18. golang not enough arguments in call to uuid.Must
  19. JavaScript名词shim与polyfill
  20. Android利用jsoup爬虫爬网页数据(一)

热门文章

  1. hive 神盾特工局_详解漫威电影宇宙历史(一)宇宙初创到泰坦星的陨落
  2. 这是一篇来源于阿里内部技术论坛的文章
  3. 百度盈利模式的弱点在哪里
  4. 凤凰男,你若孤老终身,便是晴天
  5. 计算几何03_三次参数样条曲线与Cardinal曲线
  6. gitbash EndNote Snipaste Wox+Everything 火狐 火绒浏览器 Bandizip
  7. win32,win64编程永恒;语言编程需要注意的64位
  8. 树莓派耳机接口有电流声、杂音
  9. pandas中isin()函数及其逆函数使用
  10. 计算机用户系统软件,系统软件