首页 > 其他分享 >CRC校验原理

CRC校验原理

时间:2022-11-08 23:31:28浏览次数:66  
标签:多项式 校验 信息 校验码 CRC 原理 x3


视频参考:​​http://v.youku.com/v_show/id_XMTA2Mzc5ODg=.html​

用到多项式和二进制数之间的转换

然后用到的主要运算是模2除法

 

1、循环校验码(CRC码):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

2、生成CRC码的基本原理:任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应。例如:代码1010111对应的多项式为x6+x4+x2+x+1,而多项式为x5+x3+x2+x+1对应的代码101111。

3、CRC码集选择的原则:若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得

V(x)=A(x)g(x)=xRm(x)+r(x);

其中:    m(x)为K次信息多项式, r(x)为R-1次校验多项式,

         g(x)称为生成多项式:

g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR

发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。

4、CRC校验码软件生成方法:

    借助于多项式除法,其余数为校验字段。

例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1

      假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001

      x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000;

采用多项式除法:  得余数为: 1010     (即校验字段为:1010)

发送方:发出的传输字段为:  1 0 1 1 0 0 1 1 0 10

                          信息字段       校验字段

接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法)如果能够除尽,则正确,


CRC(Cyclic Redundancy Check)循环冗余校验码

  是常用的校验码,在早期的通信中运用广泛,因为早期的通信技术不够可靠(不可靠性的来源是通信技术决定的,比如电磁波通信时受雷电等因素的影响),不可靠的通信就会带来‘确认信息’的困惑,书上提到红军和蓝军通信联合进攻山下的敌军的例子,第一天红军发了条信息要蓝军第二天一起进攻,蓝军收到之后,发一条确认信息,但是蓝军担心的是‘确认信息’如果也不可靠而没有成功到达红军那里,那自己不是很危险?于是红军再发一条‘对确认的确认信息’,但同样的问题还是不能解决,红军仍然不敢贸然行动。

  对通信的可靠性检查就需要‘校验’,校验是从数据本身进行检查,它依靠某种数学上约定的形式进行检查,校验的结果是可靠或不可靠,如果可靠就对数据进行处理,如果不可靠,就丢弃重发或者进行修复。

  CRC码是由两部分组成,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码共长n个bit,信息码长k个bit,就称为(n,k)码。它的编码规则是:

  1、首先将原信息码(kbit)左移r位(k+r=n)

  2、运用一个生成多项式g(x)(也可看成二进制数)用模2除上面的式子,得到的余数就是校验码。

  非常简单,要说明的:模2除就是在除的过程中用模2加,模2加实际上就是我们熟悉的异或运算,就是加法不考虑进位,公式是:

  0+0=1+1=0,1+0=0+1=1

  即‘异’则真,‘非异’则假。

  由此得到定理:a+b+b=a 也就是‘模2减’和‘模2加’真值表完全相同。

  有了加减法就可以用来定义模2除法,于是就可以用生成多项式g(x)生成CRC校验码。

  例如: g(x)=x4+x3+x2+1,(7,3)码,信息码110产生的CRC码就是:

  对于g(x)=x4+x3+x2+1的解释:(都是从右往左数)x4就是第五位是1,因为没有x1所以第2位就是0。

  11101 | 110,0000(设a=11101 ,b=1100000)

  取b的前5位11000跟a异或得到101

  101加上b没有取到的00得到10100

  然后跟a异或得到01001

  也就是余数1001

                  101

     11101 | 110,0000

             111 01

               1 0100

               1 1101

                 1001


  余数是1001,所以CRC码是110,1001


  标准的CRC码是,CRC-CCITT和CRC-16,它们的生成多项式是:

  CRC-CCITT=x^16+x^12+x^5+1

  CRC-16=x^16+x^15+x^2+1


先举个例子:


已知信息位为1100,生成多项式G(x) = x3+x+1,求CRC码。

M(x) = 1100 M(x)*x3 = 1100000 G(x) = 1011

M(x)*x3 / G(x) = 1110 + 010 /1011 R(x) = 010

CRC码为: M(x)*x 3+R(x)=1100000+010 =1100010

其原理是:CRC码一般在k位信息位之后拼接r位校验位生成。编码步骤如下:

(1)将待编码的k位信息表示成多项式 M(x)。

(2)将 M(x)左移 r 位,得到 M(x)*xr 。

(3)用r+1位的生成多项式G(x)去除M(x)*xr 得到余数R(x)。

(4)将M(x)*xr 与R(x)作模2加,得到CRC码。



“模2除”中间过程的减法为“模2减”,即异或运算。

 

标签:多项式,校验,信息,校验码,CRC,原理,x3
From: https://blog.51cto.com/u_3457306/5835084

相关文章

  • 通信协议:SPI协议的组成和基本原理
    SPI协议最早是由摩托罗拉公司提出的一种串行外围设备通信接口,是一种高速全双工的通信总线。它被广泛地使用在很多种产品中,比如ADC模块、LCD显示屏、存储器等设备中,包括一些......
  • 【CRC】基于MATLAB的CRC纠错码的设计
    1.软件版本matlab2017b2.本算法理论知识CRC校验利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(即CRC码)r位,并附在信息后面,构......
  • c语言查漏补缺——Win32环境下动态链接库(DLL)编程原理
    在c语言查漏补缺总结了笔记,并分享出来。有问题请及时联系博主:​​Alliswell_WP​​,转载请注明出处。目录:一、Win32环境下动态链接库(DLL)编程原理1、导出和导入函数的匹配2......
  • logrotate机制与原理
    日志实在是太有用了,它记录了程序运行时各种信息。通过日志可以分析用户行为,记录运行轨迹,查找程序问题。可惜磁盘的空间是有限的,就像飞机里的黑匣子,记录的信息再重要也只能记......
  • Kubelet源码分析(一):工作原理以及启动流程分析
    一、概要kubelet是运行在每个节点上的主要的“节点代理”,每个节点都会启动kubelet进程,用来处理Master节点下发到本节点的任务,按照PodSpec描述来管理Pod和其中的容......
  • Webpack插件核心原理
    引言围绕Webpack打包流程中最核心的机制就是所谓的Plugin机制。所谓插件即是webpack生态中最关键的部分,它为社区用户提供了一种强有力的方式来直接触及webpack......
  • 写过vue自定义指令吗,原理是什么?.m
    背景看了一些自定义指令的文章,但是探究其原理的文章却不多见,所以我决定水一篇。如何自定义指令?其实关于这个问题官方文档上已经有了很好的示例的,我们先来温故一下。除......
  • vue源码分析-diff算法核心原理
    这一节,依然是深入剖析Vue源码系列,上几节内容介绍了VirtualDOM是Vue在渲染机制上做的优化,而渲染的核心在于数据变化时,如何高效的更新节点,这就是diff算法。由于源码中关于d......
  • React核心工作原理
    ##1.1、虚拟DOM常见问题:reactvirtualdom是什么?说一下diff算法?拿到一个问题,一般回答都是是什么?为什么?怎么办?那就按照这个思路来吧!what用JavaScript对象表示DOM......
  • 想会用synchronized锁,先掌握底层核心原理
    摘要:synchronized锁修饰方法和代码块时底层实现上是一样的,但是在修饰方法时,不需要JVM编译出的字节码完成加锁操作,而synchronized在修饰代码块时,是通过编译出来的字节码生成......