CRC校验原理
CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。

【说明】“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。如100101除以1110,结果得到商为11,余数为1,如图所示。如11×11=101,如图所示。

具体来说,CRC校验原理就是以下几个步骤:

(1)先选择(可以随机选择,也可按标准选择,具体在后面介绍)一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”)。

(2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码,也称之为FCS(帧校验序列)。但要注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。

(3)再把这个校验码附加在原数据帧(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端,最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。
通过以上介绍,大家一定可以理解CRC校验的原理,并且不再认为很复杂吧。

从上面可以看出,CRC校验中有两个关键点:一是要预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式);二是把原始帧与上面选定的除进行二进制除法运算,计算出FCS。前者可以随机选择,也可按国际上通行的标准选择,但最高位和最低位必须均为“1”,如在IBM的SDLC(同步数据链路控制)规程中使用的CRC-16(也就是这个除数一共是17位)生成多项式g(x)= x16 + x15 + x2 +1(对应二进制比特串为:11000000000000101);而在ISO HDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多项式g(x)=x16 + x15 + x5 +1(对应二进制比特串为:11000000000100001)。CRC校验码的计算示例
由以上分析可知,既然除数是随机,或者按标准选定的,所以CRC校验的关键是如何求出余数,也就是CRC校验码。

下面以一个例子来具体说明整个过程。现假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程:
(1)首先把生成多项式转换成二进制数,由G(X) = X4 + X3 + 1可以知道(,它一共是5位(总位数等于最高位的幂次加1,即4+1=5),然后根据多项式各项的含义(多项式只列出二进制值为1的位,也就是这个二进制的第4位、第3位、第0位的二进制均为1,其它位均为0)很快就可得到它的二进制比特串为11001。
(2)因为生成多项式的位数为5,根据前面的介绍,得知CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。因为原数据帧10110011,在它后面再加4个0,得到101100110000,然后把这个数以“模2除法”方式除以生成多项式,得到的余数,即CRC校验码为0100,如图所示。注意参考前面介绍的“模2除法”运算法则。

(3)把上步计算得到的CRC校验码0100替换原始帧101100110000后面的四个“0”,得到新帧101100110100。再把这个新帧发送到接收端。

(4)当以上新帧到达接收端后,接收端会把这个新帧再用上面选定的除数11001以“模2除法”方式去除,验证余数是否为0,如果为0,则证明该帧数据在传输过程中没有出现差错,否则出现了差错。 通过以上CRC校验原理的剖析和CRC校验码的计算示例的介绍,大家应该对这种看似很复杂的CRC校验原理和计算方法应该比较清楚了。

转自:https://blog.csdn.net/lycb_gz/article/details/8201987

32位crc校验码程序_CRC码计算及校验原理的最通俗诠释相关推荐

  1. 还不错的微信活码程序源码+功能强大

    正文: 还不错的微信活码程序源码+功能强大,前些日子还有朋友在找这个源码来着,今天我给大家找到了,自己部署个活码就是了. 这个程序的大概意思就是,活码,字如其名,我也实测过了,东西没问题,需要安装SG ...

  2. 【解决方案】64位Linux系统下无法编译、运行32位C、C++程序的解决办法

    [故障] 1. 从32位系统里面复制过来的32位C或C++程序无法运行,提示找不到程序文件,或找不到libstdc++.so.6库 [oct1158@oct1158-fedora 32env]$ ./ ...

  3. bcc校验码计算_CRC校验你会吗?计算、校验、C语言实现,三步教你轻松搞定

    目录 前言 CRC算法简介 CRC计算 CRC校验 CRC计算的C语言实现 CRC计算工具 总结 前言 最近的工作中,要实现对通信数据的CRC计算,所以花了两天的时间好好研究了一下,周末有时间整理了一 ...

  4. 编译32位_玩转Android10源码开发定制(11)内核篇之安卓内核模块开发编译

    一. 开发前期准备 本文中使用的是linageOs源码中下载的oneplus3 安卓10内核源码进行研究测试.交叉编译链使用的是linageOs源码中的交叉编译链. lineageOs源码中onepl ...

  5. 为什么IEE754标准中,32位浮点数的指数转换为阶码时需要加上数值为127的偏移量?

    首先阶码为啥用移码表示 为了简化浮点数的比较,故我们使用移码来表示阶码位,这样就不至于在比较时去考虑两次符号位了. 其次IEEE754中有如下规定: 1)当阶码E为全0且尾数M也为全0时,表示的真值为 ...

  6. android 32位crc,android arm64硬件实现加速crc32算法

    在android arm64平台下,crc32,aes等常用算法有指令集实现.故在android下,可借助这些指令实现代码加速. 如何判断自己的手机是否支持crc32呢? 有三个方法: 方法1,直接查 ...

  7. [技术栈]CRC校验原理及C#代码实现CRC16、CRC32计算FCS校验码

    1.CRC.FCS是什么 比奇小说网 https://m.biqi.org/ CRC,全称Cyclic Redundancy Check,中文名称为循环冗余校验,是一种根据网络数据包或计算机文件等数据 ...

  8. Qt编译32位和64位程序

    下载qt-opensource-windows-x86-msvc2013_64-5.7.1.exe ,安装时选择安装源码 在msvc2013_64下面的bin include lib都是64位的,可直 ...

  9. 32位dll注入到64位程序_你用的32位还是64位?有什么区别呢?

    (给程序员零距离加星标,了解项目开发.) 粉丝福利:小编会从今天留言中抽选3名小伙伴赠送现金红包,感谢大家一直以来的支持!文末见喽!通过前面两篇文章的学习,外甥对电脑的产生了各种好奇,差点把自己电脑拆 ...

最新文章

  1. matlab 基于Topsis的熵权法2
  2. springboot配置cxf
  3. 如何在windows上搭建mysql_如何在Windows上安装多个MySQL
  4. php学习日志(3)-echoprint
  5. linux脚本定时运行脚本,linux定时运行命令脚本——crontab
  6. memcached一致性哈希及php客户端实现
  7. 是!“不会数据分析的,全是假程序员”!HR:太真实……
  8. python继承的写法_python – 从框架继承或不继承Tkinter应用程序
  9. C语言基础教程之错误处理
  10. 昂贵的聘礼 - poj 1062 (Dijkstra+枚举)
  11. 我要看的学习网站——php
  12. 【RPC】远程过程调用
  13. 国二c语言选择题要对一半,计算机二级考试C语言程序设计题有步骤分吗
  14. ATV320、ATV32变频器报tnF如何处理?
  15. STC15单片机功能和应用电路
  16. 580刷590bios_身价瞬间涨几百 RX 480刷bios变身RX 580
  17. 【2017宁波联考】生成树
  18. API Design for ios 译文
  19. 苹果账号被盗用户:支付宝、微信被盗刷追偿难
  20. 记录一下之前写的文章--测试之不可承受之轻

热门文章

  1. c++ vector 指针
  2. PHP中include和require
  3. opencv2生成图像的梯度图
  4. 利用swapoff和swapon刷新swap缓存
  5. Python常用框架:Flask
  6. 人工操作阶段计算机是如何工作的,第一章计算机基础概述全解.ppt
  7. eclipse写java实现端口_使用eclipse(windows)在java中使用IPv6地址和端口号创建套接字...
  8. java 连接mysql 8.0,java连接mysql 8.0的问题
  9. android gpio驱动实例,Android/Linux 驱动层对GPIO口的操作方法和相关代码
  10. html旋转墙壁效果,css3实现照片墙效果,鼠标悬浮时旋转放大并摆正