循环冗余校验检错方案(CRC)

2023-11-05 03:38

本文主要是介绍循环冗余校验检错方案(CRC),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

循环冗余校验检错方案(CRC)

1、crc校验原理
crc校验的根本思想就是在要发送的帧后面附加一个二进制序列,生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使生成的新帧能与发送端和接收端共同选定的某个特定数整除,需要注意的是,这里不是采用的二进制除法,而是采用“模2除法”。到达接收端后,再把接收到的新帧除以(模2除)这个选定的除数。因为在发送端已经通过附加一个数做了去余处理,故得出的结果应该没有余数。如果出现了余数,则说明在传输的过程中出现了差错。
【说明】“模2除法”和“算数除法”类似,但它既不向上借位,也不比较除数与被除数相同位的数的大小,只要以相同的位数整除即可。模2加法运算:1+1=0, 1+0=1, 0+0=0,无进位,也无借位。模2减法运算:1-1=0, 1-0=1, 0-1=1, 0-0=0,无进位,也无借位。这两种运算相当于逻辑运算中的异或运算。如 100101除以1110,结果得到商为110,余数为1。
具体来说,crc校验主要分为一下几个步骤:
1)先选择(可以随机选择,也可以按照标准选择)一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比特串,通常以多项式表达,所以crc又称多项式编码方法,这个多项式也称为“生成多项式”)。
2)假定所选的数据帧为k位,然后在要发送的数据帧(假定m位)的后面补上k-1位“0”,然后用这个新帧(一共m+k-1位)以“模2除法”的方式除以上面这个除数,所得到的余数(也是二进制比特序列)就是该帧的crc校验码,也称之为FCS(帧校验序列)。 但要注意的是,余数的位数一定要只比除数的位数少一位,哪怕前面位是0,甚至全位0时都不能省略。
3)再把这个校验码附在原数据帧(就是m位的帧,不是生成的m+k-1位的帧)的后面,构建一个新帧发送给接收端;最后再在接收端再把这个新帧以“模2除法”的方式除以前面选择的除数,如果没有余数,则表明该帧在传输的过程中没有出错,否则出现了差错。
从上面可以看出,CRC校验中有两个关键点:一是要确定一个发送端可以接收端都用来作为除数的二进制比特串(或多项式),二是把原始帧与上面选定的除数进行二进制“模2除法”运算,计算出FCS,前者可以随机选择,也可以按照国际上通行的标准选择,但是 最高位和最低位必须均为“1”。如在IBM的SDLC(同步数据链路控制)规程中是用的CRC-16生成多项式g(x) = x^16 + x^15 + x^2 + 1(对应二进制比特串位: 11000000000000101);而在ISO HDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中是用CCITT-16生成多项式g(x) = x^16 + x^15 + x^5 + 1(对应二进制比特串为: 11000000000100001)。

2、crc校验码的计算示例
现假设选择CRC生成多项式位g(x) =  x^4 + x^3 + 1,要求求出二进制序列 10110011的CRC校验码。
1)根据生成多项式可以得到二进制比特序列除数位 11001
2)因为生成多项式的位数为5,得知CRC校验码的位数为4,所以在原始帧后面添加4个0,得到 10110011 0000,然后把这个数以“模2除法”的方式除以生成多项式,得到余数(CRC校验码)位 0100,计算过程如下:



3)把上面计算出来的校验码0100替换帧 101100110000后面的四个0,得到新帧 10110011 0100,再把这个帧发送给接收端。
4)当接收端收到这个新帧后,会以“模2除法”的方式除以上面选定的除数 11001,验证余数是否为0,如果为0,则说明上述帧在传输的过程中没有发生差错,否则出现了差错。

这篇关于循环冗余校验检错方案(CRC)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/347161

相关文章

SpringBoot3.X 整合 MinIO 存储原生方案

《SpringBoot3.X整合MinIO存储原生方案》本文详细介绍了SpringBoot3.X整合MinIO的原生方案,从环境搭建到核心功能实现,涵盖了文件上传、下载、删除等常用操作,并补充了... 目录SpringBoot3.X整合MinIO存储原生方案:从环境搭建到实战开发一、前言:为什么选择MinI

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

Python循环结构全面解析

《Python循环结构全面解析》循环中的代码会执行特定的次数,或者是执行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都执行一次,这篇文章给大家介绍Python循环结构解析,感兴趣的朋友跟随... 目录for-in循环while循环循环控制语句break语句continue语句else子句嵌套的循

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Springboot3+将ID转为JSON字符串的详细配置方案

《Springboot3+将ID转为JSON字符串的详细配置方案》:本文主要介绍纯后端实现Long/BigIntegerID转为JSON字符串的详细配置方案,s基于SpringBoot3+和Spr... 目录1. 添加依赖2. 全局 Jackson 配置3. 精准控制(可选)4. OpenAPI (Spri

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig