CRC循环冗余校验原理

合集下载

crc8校验原理和计算方法

crc8校验原理和计算方法

crc8校验原理和计算方法CRC8(Cyclic Redundancy Check,循环冗余校验)是一种常用的校验算法,用于检测数据传输过程中的错误。

CRC8校验原理和计算方法可以帮助我们了解CRC8的工作原理和具体步骤。

一、CRC8校验原理CRC8校验是通过生成多项式来实现的,根据不同的生成多项式,CRC8校验可以分为多种不同的标准。

其中,CRC-8/ATM标准是一种常用的CRC8校验算法。

CRC8校验原理是基于二进制的异或运算和移位运算来实现的。

在CRC8校验过程中,需要预先定义一个生成多项式,然后将待校验的数据和生成多项式进行一系列的异或和移位运算,最后得到校验值。

二、CRC8计算方法1. 定义生成多项式需要定义一个生成多项式。

以CRC-8/ATM标准为例,生成多项式为0x07。

2. 初始化校验值将校验值初始为0x00。

3. 逐位计算从待校验的数据的最高位开始,逐位与校验值进行异或运算。

如果该位为1,则执行异或运算;如果该位为0,则继续下一位。

4. 左移运算每次异或运算后,将校验值左移一位。

5. 异或运算如果左移后的校验值的最高位为1,则执行与生成多项式的异或运算。

6. 重复以上步骤重复上述步骤,直到待校验数据的所有位都处理完毕。

7. 得到校验值最后得到的校验值即为CRC8校验值,可以用于校验数据传输过程中的错误。

三、应用场景CRC8校验算法广泛应用于串行通信、网络传输、数据存储等领域。

通过对数据进行CRC8校验,可以提高数据传输的可靠性,减少错误的发生。

在串行通信中,发送端计算数据的CRC8校验值并将其附加到数据后面,接收端收到数据后同样计算CRC8校验值,然后与附加的校验值进行比对,如果一致,则说明数据传输无误;如果不一致,则说明数据传输中发生了错误。

在网络传输中,CRC8校验算法可以用于校验数据包的完整性。

发送端将数据包的CRC8校验值附加到数据包尾部,接收端收到数据包后同样计算CRC8校验值,然后与附加的校验值进行比对,以判断数据包是否在传输过程中发生了错误。

CRC原理

CRC原理

CRC循环冗余码原理一在远距离数据通信中,为确保高效而无差错地传送数据,必须对数据进行校验即差错控制。

循环冗余校验CRC(Cyclic Redundancy Check)是对一个传送数据块进行校验,是一种高效的差错控制方法。

1 循环冗余校验码原理CRC校验采用多项式编码方法,如一个8位二进制数(B7B6B5B4B3B2B1B0)可以用7阶二进制码多项式B7X7+B6X6+B5X5+B4X4+B3X3+B2X2+B1X1+B0X0表示。

例如11000001可表示为1X7+1X6+0X5+0X4+0X3+0X2+0X1+0X0一般说,n位二进制数可用(n-1)阶多项式表示。

它把要发送的数据位串看成是系数只能为“1”或“0”的多项式。

一个n位的数据块可以看成是从Xn-1到X0的n项多项式的系数序列,位于数据块左边的最高位是Xn-1项的系数,次高位是Xn-2项的系数,依此类推,位于数据块右边的最低位是X0项的系数,这个多项式的阶数为n-1。

多项式乘除法运算过程与普通代数多项式的乘除法相同。

多项式的加减法运算以2为模,加减时不进、错位,如同逻辑异或运算。

采用CRC校验时,发送方和接收方事先约定一个生成多项式G(X),并且G(X)的最高项和最低项的系数必须为1。

设m位数据块的多项式为M(X),生成多项式G(X)的阶数必需比M(X)的阶数低。

CRC校验码的检错原理是:发送方先为数据块生成CRC校验码,使这个CRC校验码的多项式能被G(X)除尽,实际发送此CRC校验码;接收方用收到的CRC校验码除以G(X),如果能除尽,表明传输正确,否则,表示有传输错误,请求重发。

生成数据块的CRC校验码的方法是:(1) 设G(X)为r阶,在数据块末尾添加r个0,使数据块为m+r位,则相应的多项式为XrM(X);(2) 以2为模,用对应于G(X)的位串去除对应于XrM(X)的位串,求得余数位串;(3) 以2为模,从对应于XrM(X)的位串中减去余数位串,结果就是为数据块生成的带足够校验信息的CRC校验码位串。

CRC校验原理分析

CRC校验原理分析

CRC校验原理分析CRC(循环冗余校验码)是一种校验码,常用于数据传输中的错误检测,通过对数据进行一系列的异或运算得到一个固定长度的校验码。

CRC校验原理是一种基于多项式计算的校验方法,本文将从CRC校验的基本原理、计算过程、特点和应用等方面进行详细分析。

CRC校验的基本原理如下:假设需要校验的数据为D,校验码为CRC,CRC校验是通过对数据D添加一个校验位得到校验码CRC。

发送方在发送数据之前,首先计算出校验码CRC,并将CRC添加到数据D的末尾一起发送。

接收方在接收到数据之后,再次计算CRC,与接收到的CRC进行比较,如果两者一致,则说明数据传输过程中没有出错;如果不一致,则说明数据传输过程中发生了错误。

1.定义一个生成多项式G,通常为一个固定的二进制数,比如CRC-16的生成多项式为x^16+x^15+x^2+12.初始化一个寄存器为全0。

3.按位地从输入数据D的最高位开始处理,依次将输入数据D的每一位与寄存器的最高位进行异或运算。

4.将寄存器向左移一位,把输入数据D的下一位填入寄存器的最低位。

5.如果寄存器的最高位为1,则将寄存器与生成多项式G进行异或运算。

6.重复以上步骤,直到处理完输入数据D的所有位。

7.最终得到的寄存器的值就是CRC校验码。

1.高效性:CRC校验码通过异或运算实现,在计算速度上非常高效。

2.容错性:CRC校验码可以检测出多位错误,具有较强的容错性。

3.校验位数可变性:根据不同的需求,可以选择不同长度的CRC校验码,常见的有CRC-16、CRC-32等。

4.硬件支持:CRC校验码的计算与硬件电路结构相关,可以通过专用的硬件电路加速计算过程。

5.无纠错性:CRC校验码可以检测错误,但无法进行纠错。

CRC校验广泛应用于数据通信、磁盘存储等领域,具有很高的实用性。

在数据通信中,发送方可以通过CRC校验码确认数据是否正确发送,接收方可以通过CRC校验码检测出数据传输中的错误,对错误数据进行重发或者纠正。

循环冗余校验原理

循环冗余校验原理

循环冗余校验原理循环冗余校验(Cyclic Redundancy Check,CRC)是一种常用的数据校验方法,用于检测和纠正数据传输过程中的错误。

CRC通过对数据进行取模运算,生成一个检验值,并将该检验值附加到原始数据后面进行传输。

接收端根据接收到的数据和附加的检验值,重新计算校验值,并与接收到的检验值进行对比,如果二者相等,则数据传输无误。

CRC的实现原理如下:1.数据处理:将待发送的数据按照指定的编码规则进行处理,通常是将每个字节的二进制数据展开为一串二进制位。

2. 计算校验值:利用生成多项式(Generator Polynomial)对数据进行除法运算,得到余数。

生成多项式是一个固定的值,通常为16、32或64位。

生成多项式有多种选择,常用的有CRC-16、CRC-32等。

3.附加校验值:将计算得到的余数附加到原始数据的末尾,形成一个完整的数据帧。

4.传输数据:将带有附加校验值的数据帧传输给接收端。

5.接收端处理:接收端收到数据后,利用生成多项式对数据进行除法运算,得到余数。

6.比较校验值:接收端将计算得到的余数与接收到的检验值进行比较,如果相等,则数据传输正确;如果不相等,则表示数据传输过程中发生了错误。

CRC的优点和应用领域如下:1.高效性:CRC的计算过程相对简单,能够快速生成和校验校验值,不需要像逐位加和校验那样需要逐个比特进行计算。

2.低误码率:CRC能够检测出多种不同类型的错误,包括单比特错误、双比特错误、插入错误等。

同时,CRC的位移敏感性较高,对差错位置非常敏感,有助于快速定位错误。

3.广泛应用:CRC被广泛应用于计算机网络、存储系统、通信系统等领域,用于数据传输的完整性检验。

如何选择合适的生成多项式呢?在选择生成多项式时,需要考虑其具体应用场景和对数据传输的要求。

一般来说,生成多项式应该具有以下特性:1.高纠错能力:生成多项式应能够尽可能地检测和纠正错误,对于常见的错误类型有较好的检测率。

CRC校验原理

CRC校验原理

CRC校验原理1.CRC简介CRC全称循环冗余校验(Cyclic Redundancy Check, CRC),是通信领域数据传输技术中常⽤的检错⽅法,⽤于保证数据传输的可靠性。

⽹上有关这⽅⾯的博客和资料很多,本⽂尽量简洁的梳理⼀下它的原理。

后⾯还会结合⾃⼰的实践经验(不多),说⼀说如何使⽤verilog语⾔在FPGA中做CRC校验。

感兴趣的朋友可以关注我后续的更新,⼀起交流学习!CRC校验的基本思路是数据发送⽅发送数据之前,先⽣成⼀个CRC校验码,可以是单bit也可以是多bit,并附在有效数据末尾,以串⾏⽅式发送到接收⽅。

接收⽅接收到数据后,进⾏CRC校验,根据校验结果就可以知道数据是否有误。

CRC校验码的⽣成:将有效数据扩展后作为被除数,使⽤⼀个指定的多项式作为除数,进⾏模⼆除法,得到的余数就是校验码。

数据接收⽅的CRC校验:将接受的数据(有效数据+CRC校验码)扩展后作为被除数,⽤指定的多项式作为除数,进⾏模⼆除法,得到余数为0,则表⽰校验正确。

2.CRC校验过程2.1多项式选取多项式关系到检查错误的可靠性,其中有⼀定的数学关系,这⾥不去深究,感兴趣的朋友可查阅通信原理和线性编码相关书籍。

多项式的常规表达式:G(x)=x^n+x^(n-1)…+1,其中n>=1。

也可以⽤2进制数表⽰,以便软件编程。

例如多项式G(x)=x^5+x^3+x^2+1,⽤2进制表⽰就是101101;多项式G(x)=x^6+x^5+x^1+1,⽤2进制表⽰就是1100011。

很容易看出规律吧。

有些资料⾥将多项式最⾼位的1省略,不过这⾥建议⼿动计算时保留这⼀位,免得出错。

通信领域有⼀些常⽤的多项式,如下表⽰所⽰,可根据通信⽅式选择,例如CRC-5/USB算法对应的是⽤于USB通信的CRC多项式。

2.2求余数(发送⽅)求余⽬的是得到CRC校验码。

⾸先将有效数据扩展n位作为被除数,n是多项式的最⾼次幂,例如前⾯的多项式101101最⾼次幂是5(⽐2进制位数少1),则有效数据扩展5位。

CRC循环冗余校验的原理

CRC循环冗余校验的原理

CRC循环冗余校验的原理循环冗余校验(CRC)是一种用于检测或纠正错误的数据校验方法,常用于通信中对数据进行完整性校验。

CRC的原理是利用一个固定的产生多项式对数据进行除法运算,并将余数作为校验码添加到数据中,接收方通过对接收到的数据再次进行除法运算,将得到的余数与发送方发送的校验码进行比较,用于判断接收到的数据是否出现了错误。

CRC的计算方式如下:1.选择一个生成多项式,该多项式的位数比待校验数据的位数少1、通常使用的生成多项式有常用的CRC-32和CRC-16多项式。

2.在待校验数据后添加一组位数等于生成多项式位数的0,这个数据称为"扩展数据"。

3.将扩展数据除以生成多项式,取得的余数即为校验码。

4.将校验码添加到原数据后,形成带有校验码的完整数据,即为发送数据。

例如,我们用CRC-16多项式来演示CRC的运算步骤。

生成多项式是一个16位的二进制数:10001101000101000(0x1021)。

假设我们发送的数据是一个16位的二进制数:11010101000111100。

第一步,在待校验数据后添加16位的0,形成扩展数据:110101010001111000000000000000000。

第二步,将扩展数据与生成多项式进行除法运算,得到的余数为:0100110011100100(0x4CE4)。

第三步,将校验码添加到原数据后,得到发送数据为:110101010001111000100110011100100。

这样,发送方将这个发送数据发送给接收方。

接收方接收到数据后,进行相同的操作,再次用生成多项式进行除法运算,得到余数。

如果余数为0,则表明数据没有错误;如果余数不为0,则表明数据存在错误。

CRC的性质和应用:1.CRC可以检测出所有奇数位数量的错误,以及几乎所有偶数位数量的错误。

对于t位的生成多项式,CRC可以检测出所有长度小于t的错误序列。

2.CRC不仅可以用于数据的检错,还可以用于数据的纠错。

循环冗余检验 (CRC) 算法原理

循环冗余检验 (CRC) 算法原理

循环冗余检验(CRC) 算法原理Cyclic R edundancy C heck循环冗余检验,是基于数据计算一组效验码,用于核对数据传输过程中是否被更改或传输错误。

算法原理假设数据传输过程中需要发送15位的二进制信息g=101001110100001,这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1,其中g中第k 位的值,对应g(x)中x^k的系数。

将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。

h(x)可以自由选择或者使用国际通行标准,一般按照h(x)的阶数m,将CRC算法称为CRC-m,比如CRC-32、CRC-64等。

国际通行标准可以参看/wiki/Cyclic_redundancy_checkg(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。

比如将11001与10101做xor运算:明白了xor运算法则后,举一个例子使用CRC-8算法求101001110100001的效验码。

CRC-8标准的h(x) = x^8 + x^7 + x^6 + x^4 + x^2 + 1,既h是9位的二进制串111010101。

经过迭代运算后,最终得到的r是10001100,这就是CRC效验码。

通过示例,可以发现一些规律,依据这些规律调整算法:1. 每次迭代,根据gk的首位决定b,b是与gk进行运算的二进制码。

若gk的首位是1,则b=h;若gk的首位是0,则b=0,或者跳过此次迭代,上面的例子中就是碰到0后直接跳到后面的非零位。

2. 每次迭代,gk的首位将会被移出,所以只需考虑第2位后计算即可。

这样就可以舍弃h的首位,将b取h的后m位。

比如CRC-8的h是111010101,b只需是11010101。

3. 每次迭代,受到影响的是gk的前m位,所以构建一个m位的寄存器S,此寄存器储存gk的前m位。

crc校验码 详细介绍看懂了就会了

crc校验码 详细介绍看懂了就会了

循环冗余校验码(CRC)的基本原理是:在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码又叫(N,K)码。

对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。

根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。

校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*2的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。

通过C(x)*2的R次方除以生成多项式G(x)得到的余数就是校验码。

编辑本段几个基本概念1、多项式与二进制数码多项式和二进制数有直接对应关系:x的最高幂次对应二进制数的最高位,以下各位对应多项式的各幂次,有此幂次项对应1,无此幂次项对应0。

可以看出:x的最高幂次为R,转换成对应的二进制数有R+1位。

多项式包括生成多项式G(x)和信息多项式C(x)。

如生成多项式为G(x)=x^4+x^3+x+1,可转换为二进制数码11011。

而发送信息位 1111,可转换为数据多项式为C(x)=x^3+x^2+x+1。

2、生成多项式是接受方和发送方的一个约定,也就是一个二进制数,在整个传输过程中,这个数始终保持不变。

在发送方,利用生成多项式对信息多项式做模2除生成校验码。

在接受方利用生成多项式对收到的编码多项式做模2除检测和确定错误位置。

应满足以下条件:a、生成多项式的最高位和最低位必须为1。

b、当被传送信息(CRC码)任何一位发生错误时,被生成多项式做除后应该使余数不为0。

c、不同位发生错误时,应该使余数不同。

d、对余数继续做除,应使余数循环。

3 CRC码的生成步骤1、将x的最高次幂为R的生成多项式G(x)转换成对应的R+1位二进制数。

2、将信息码左移R位,相当与对应的信息多项式C(x)*2的R次方。

3、用生成多项式(二进制数)对信息码做除,得到R位的余数。

4、将余数拼到信息码左移后空出的位置,得到完整的CRC码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CRC校验原理
转载:CRC校验原理
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)=x R m(x)+r(x);
其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式,
g(x)称为生成多项式:
g(x)=g
0+g
1
x+ g
2
x2+...+g
(R-1)
x(R-1)+g
R
x R
发送方通过指定的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除”中间过程的减法为“模2减”,即异或运算。

相关文档
最新文档