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

相关文章

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

防止Linux rm命令误操作的多场景防护方案与实践

《防止Linuxrm命令误操作的多场景防护方案与实践》在Linux系统中,rm命令是删除文件和目录的高效工具,但一旦误操作,如执行rm-rf/或rm-rf/*,极易导致系统数据灾难,本文针对不同场景... 目录引言理解 rm 命令及误操作风险rm 命令基础常见误操作案例防护方案使用 rm编程 别名及安全删除

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

使用Python实现Word文档的自动化对比方案

《使用Python实现Word文档的自动化对比方案》我们经常需要比较两个Word文档的版本差异,无论是合同修订、论文修改还是代码文档更新,人工比对不仅效率低下,还容易遗漏关键改动,下面通过一个实际案例... 目录引言一、使用python-docx库解析文档结构二、使用difflib进行差异比对三、高级对比方

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

MySQL容灾备份的实现方案

《MySQL容灾备份的实现方案》进行MySQL的容灾备份是确保数据安全和业务连续性的关键步骤,容灾备份可以分为本地备份和远程备份,主要包括逻辑备份和物理备份两种方式,下面就来具体介绍一下... 目录一、逻辑备份1. 使用mysqldump进行逻辑备份1.1 全库备份1.2 单库备份1.3 单表备份2. 恢复

Springboot项目登录校验功能实现

《Springboot项目登录校验功能实现》本文介绍了Web登录校验的重要性,对比了Cookie、Session和JWT三种会话技术,分析其优缺点,并讲解了过滤器与拦截器的统一拦截方案,推荐使用JWT... 目录引言一、登录校验的基本概念二、HTTP协议的无状态性三、会话跟android踪技术1. Cook

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr