循环冗余校验检错方案(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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

MySQL中闪回功能的方案讨论及实现

《MySQL中闪回功能的方案讨论及实现》Oracle有一个闪回(flashback)功能,能够用户恢复误操作的数据,这篇文章主要来和大家讨论一下MySQL中支持闪回功能的方案,有需要的可以了解下... 目录1、 闪回的目标2、 无米无炊一3、 无米无炊二4、 演示5、小结oracle有一个闪回(flashb

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4