CRC冗余校验举例和原理

什么是CRC校验?
CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

CRC校验原理:
其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。
模2除法:
模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。在循环冗余校验码(CRC)的计算中有应用到模2除法。
例:
CRC校验步骤:
CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

具体步骤:
1. 选择合适的除数
2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。
3. 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。

CRC校验码计算示例:
现假设选择的CRC生成多项式为GX= X4 + X3 + 1,要求出二进制序列10110011CRC校验码。下面是具体的计算过程:

①将多项式转化为二进制序列,由GX = X4 + X3 + 1可知二进制一种有五位,第4位、第三位和第零位分别为1,则序列为11001
②多项式的位数位5,则在数据帧的后面加上5-1位0,数据帧变为101100110000,然后使用模2除法除以除数11001,得到余数。
③将计算出来的CRC校验码添加在原始帧的后面,真正的数据帧为101100110100,再把这个数据帧发送到接收端。
④接收端收到数据帧后,用上面选定的除数,用模2除法除去,验证余数是否为0,如果为0,则说明数据帧没有出错。





https://blog.csdn.net/d_leo/article/details/73572373

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ 多态原理初步01

当父类 Animal 的speak 前面加上 virtual 关键字之后,这个speak函数就变成了虚函数,Animal类结构发生了变化, 有了一个vfptr (虚函数指针),指向了vftable(虚函数表), 这个虚函数表里…

面向对象与面向过程的本质的区别

https://blog.csdn.net/jerry11112/article/details/79027834 如果你很想搞明白面向对象是什么,面向过程是什么,或者说二者之间的区别是什么,那么就花费一点时间来研读一下这篇博客,你一定会有很大的收获的! 一、面向…

grep参数说明及常用用法

grep参数说明及常用用法 查看文件内容 [koulocalhost ~]$ more size.txt b124230 b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 b103303 a013386 b044525 m8987131 B081016 M45678 B103303 BADc2345 [] : 查看符合范围内的信息 [koulocalho…

进程的状态与种类

● 运行:正占用处理器   ● 就绪:只要获得处理器即可运行。   ● 阻塞:正等待某个事件(如I/O完成)的发生。  在不少系统中,还增加了两种基本状态:   ● 新状态:一个进程刚刚…

int * p =NULL;和*p =NULL的区别a和a的区别

1.int * p NULL;和*p NULL的区别 1 .int * p NULL int *pNULL;定义一个指针变量p,其指向的内存里面保存的是int类型的数据;再定义变量p的同时把p的值设置为0x00000000, 而不是把*p的值设置为0x00000000 2.*p NULL int i 10&am…

当我们说TCP是可靠协议时,我们真正表达的是什么

转载出处:https://blog.csdn.net/dog250/article/details/82177299 很明确地说,从通信意义上推敲,TCP一点都不可靠。一个抽象的协议,怎么可能左右介质来保证可靠,不存在的。但凡是经由某种介质的通信行为均不可能是绝对…

有一个小白程序员,写了一个只能对5个数字进行排序的函数,现在有25个不重复的数字,

题目:有一个小白程序员,写了一个只能对5个数字进行排序的函数,现在有25个不重复的数字,请问小白同学最少调用几次该函数,可以找出其中最大的三个数? A.5 B.6 C.7 D.8 答案:C 解析&#xf…

初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为

初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:() 8 3 2 5 1 6 4 7 3 2 8 5 1 4 6 7 3 8 2 5 1 6 7 4 8 2 3 5 1 4 7 6 A

设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70)进行一趟归并后的结果为

设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70),其中含有5个长度为2的有序子表,则用归并排序的方法对该记录关键字序列进行一趟归并…

文字常量区和栈区考点

求以下程序输出结果 #include <stdio.h>char * fun1() {char * str "hello";return str; }char * fun2() {char str[] "world";return str; } int main() {printf("%s\n", fun1()); printf("%s\n", fun2()); return 0; }结…

判断栈的压入和弹出

序列1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5是压栈序列。序列 4&#xff0c;3&#xff0c;5&#xff0c;1&#xff0c;2是弹出序列。判断第二个是不是弹出序列 三步走 如果下一个弹出的数字刚好是栈顶数字&#xff0c;直接弹出如果不在栈顶&#xff0c;就一直…

动态规划学习笔记2

题目描述&#xff1a; 在一个mn的棋盘的每一格都放有一个礼物&#xff0c;每个礼物都有一定的价值&#xff08;价值大于0&#xff09;。你可以从棋盘的左上角开始拿格子里的礼物&#xff0c;并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物&…

内存碎片产生原因及解决办法

来源&#xff1a;知乎链接&#xff1a;https://www.zhihu.com/question/51836333/answer/145693402内存碎片通常分为内部碎片和外部碎片&#xff1a; 1. 内部碎片是由于采用固定大小的内存分区&#xff0c;当一个进程不能完全使用分给它的固定内存区域时就产生了内部碎片&…

KMP算法的举例加图解

文章出处&#xff1a;阮一峰&#xff0c;进行重新排版整理 举例来说&#xff0c;有一个字符串"BBC ABCDAB ABCDABCDABDE"&#xff0c;我想知道&#xff0c;里面是否包含另一个字符串"ABCDABD"&#xff1f; 首先&#xff0c;字符串"BBC ABCDAB ABCDAB…

进程间通讯的四种方式

文章目录共享内存信号管道消息队列通信方法 无法介于内核态与用户态的原因 管道&#xff08;不包括命名管道&#xff09; 局限于父子进程间的通信。 消息队列 在硬、软中断中无法无阻塞地接收数据。 信号量 无法介于内核态和用户态使用。 共享内存 需要信号量辅助&#xff0c;而…

TCP/IP四层模型

文章目录TCP/IP协议族体系结构以及主要协议数据链路层网络层传输层应用层TCP/IP协议族体系结构以及主要协议 TCP/IP协议族是一个四层协议系统&#xff0c;自底而上分别是数据链路层、网络层、传输层和应用层。每一层完成不同 的功能&#xff0c;且通过若干协议来实现&#xff…

Manacher算法图解

看了好久的Manacher算法&#xff0c;觉得还是要自己画一遍&#xff0c;自己把代码写一遍才能理解 下面分享一下&#xff0c;如果有错&#xff0c;希望指正 简陋版本的&#xff0c;但是他基本只是做到了求取最长回文字符串&#xff0c;严格来说它并不是Manacher’s Algorithm-…

Flink 客户端操作命令及可视化工具

Flink提供了丰富的客户端操作来提交任务和与任务进行交互。下面主要从Flink命令行、Scala Shell、SQL Client、Restful API和 Web五个方面进行整理。 在Flink安装目录的bin目录下可以看到flink&#xff0c;start-scala-shell.sh和sql-client.sh等文件&#xff0c;这些都是客户…

ySQL挑战搭建一个简易的成绩管理系统的数据库

文章为自己搜索网上资源&#xff0c;再在这里进行整理&#xff0c;所以标注为转载 [实验步骤](https://www.shiyanlou.com/courses/reports/1347700) 总结做实验注意事项&#xff1a; 1.添加主键 2.主键和外键的关系 3.注意自增的书写添加 mysql 如何修改、添加、删除表主键…