最通俗的CRC校验原理剖析

原文地址:http://blog.51cto.com/winda/1063951

1. CRC校验原理

    CRC校验原理看起来比较复杂,好难懂,因为大多数书上基本上是以二进制的多项式形式来说明的。其实很简单的问题,其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。如果有余数,则表明该帧在传输过程中出现了差错。

     【说明】“模2除法”与“算术除法”类似,但它既不向上位借位,也不比较除数和被除数的相同位数值的大小,只要以相同位数进行相除即可。模2加法运算为:1+1=0,0+1=1,0+0=0,无进位,也无借位;模2减法运算为:1-1=0,0-1=1,1-0=1,0-0=0,也无进位,无借位。相当于二进制中的逻辑异或运算。也就是比较后,两者对应位相同则结果为“0”,不同则结果为“1”。如100101除以1110,结果得到商为11,余数为1,如图5-9左图所示。如11×11=101,如图5-9右图所示。

                                        图5-9 “模2除法”和“模2乘法”示例

     具体来说,CRC校验原理就是以下几个步骤:

   (1)先选择(可以随机选择,也可按标准选择,具体在后面介绍)一个用于在接收端进行校验时,对接收的帧进行除法运算的除数(是二进制比较特串,通常是以多项方式表示,所以CRC又称多项式编码方法,这个多项式也称之为“生成多项式”)。

   (2)看所选定的除数二进制位数(假设为k位),然后在要发送的数据帧(假设为m位)后面加上k-1位“0”,然后以这个加了k-1个“0“的新帧(一共是m+k-1位)以“模2除法”方式除以上面这个除数,所得到的余数(也是二进制的比特串)就是该帧的CRC校验码,也称之为FCS(帧校验序列)。但要注意的是,余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略

   (3)再把这个校验码附加在原数据帧(就是m位的帧,注意不是在后面形成的m+k-1位的帧)后面,构建一个新帧发送到接收端;最后在接收端再把这个新帧以“模2除法”方式除以前面选择的除数,如果没有余数,则表明该帧在传输过程中没出错,否则出现了差错。

    通过以上介绍,大家一定可以理解CRC校验的原理,并且不再认为很复杂吧。

    从上面可以看出,CRC校验中有两个关键点:一是要预先确定一个发送端和接收端都用来作为除数的二进制比特串(或多项式);二是把原始帧与上面选定的除进行二进制除法运算,计算出FCS。前者可以随机选择,也可按国际上通行的标准选择,但最高位和最低位必须均为“1”,如在IBM的SDLC(同步数据链路控制)规程中使用的CRC-16(也就是这个除数一共是17位)生成多项式g(x)=x16 + x15 + x2 +1(对应二进制比特串为:11000000000000101);而在ISO HDLC(高级数据链路控制)规程、ITU的SDLC、X.25、V.34、V.41、V.42等中使用CCITT-16生成多项式g(x)=x16 + x15 + x5 +1(对应二进制比特串为:11000000000100001)。

2.    CRC校验码的计算示例

   由以上分析可知,既然除数是随机,或者按标准选定的,所以CRC校验的关键是如何求出余数,也就是校验码(CRC校验码)。

    下面以一个例子来具体说明整个过程。现假设选择的CRC生成多项式为G(X) = X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。下面是具体的计算过程:

   (1)首先把生成多项式转换成二进制数,由G(X) = X4 + X3 + 1可以知道(,它一共是5位(总位数等于最高位的幂次加1,即4+1=5),然后根据多项式各项的含义(多项式只列出二进制值为1的位,也就是这个二进制的第4位、第3位、第0位的二进制均为1,其它位均为0)很快就可得到它的二进制比特串为11001

   (2)因为生成多项式的位数为5,根据前面的介绍,得知CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。因为原数据帧10110011,在它后面再加4个0,得到101100110000,然后把这个数以“模2除法”方式除以生成多项式,得到的余数(即CRC码)为0100,如图5-10所示。注意参考前面介绍的“模2除法”运算法则。

                                                                             图5-10 CRC校验码计算示例

    (3)把上步计算得到的CRC校验0100替换原始帧101100110000后面的四个“0”,得到新帧101100110100。再把这个新帧发送到接收端。

    (4)当以上新帧到达接收端后,接收端会把这个新帧再用上面选定的除数11001以“模2除法”方式去除,验证余数是否为0,如果为0,则证明该帧数据在传输过程中没有出现差错,否则出现了差错。

      通过以上CRC校验原理的剖析和CRC校验码的计算示例的介绍,大家应该对这种看似很复杂的CRC校验原理和计算方法应该比较清楚了。

      附表:标准CRC生成多项式如下:

   名称                  生成多项式                        简记式*              标准引用

   CRC-4              x4+x+1                               3                        ITU G.704

   CRC-8              x8+x5+x4+1                       0x31                   

   CRC-8              x8+x2+x1+1                       0x07                   

   CRC-8              x8+x6+x4+x3+x2+x1          0x5E

   CRC-12            x12+x11+x3+x+1                80F

   CRC-16            x16+x15+x2+1                   8005                   IBM SDLC

   CRC16-CCITT  x16+x12+x5+1                   1021                   ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCS

   CRC-32             x32+x26+x23+...+x2+x+1   04C11DB7         ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCS

   CRC-32c           x32+x28+x27+...+x8+x6+1 1EDC6F41         SCTP





  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: LabVIEW是一款图形化编程环境,可用于开发各种应用程序。CRC(循环冗余检验)是一种常用的数据校验方法,其中CRC-8是一种8位循环冗余检验。 在LabVIEW中,可以通过使用适当的函数和模块来实现CRC-8校验。下面是CRC-8校验的大致框图: 1. 输入数据:首先,在LabVIEW中设置输入的数据,这可以是一个字符串、数组或二进制数据。这些数据将被发送到CRC-8校验模块。 2. CRC-8生成多项式:定义CRC-8生成多项式,这是一个固定的值,用于生成8位CRC校验码。常见的CRC-8生成多项式有0x07和0x8C。 3. 初始化CRC寄存器:在进行CRC计算之前,需要将CRC寄存器的初始值设置为0xFF。 4. CRC计算循环:使用循环结构,在每个循环中对输入数据进行处理。首先,将每个输入字节与CRC寄存器的值进行异或操作,然后将结果与生成多项式进行异或。这一步将更新CRC寄存器的值。 5. 是否还有更多的数据:在每个循环后,检查是否还有更多的数据需要处理。如果还有,返回到第4步;否则,进入下一步。 6. 最终CRC校验码:当所有的数据都被处理后,最终的CRC校验码将保存在CRC寄存器中。 7. 输出结果:将最终的CRC校验码输出为一个整数、二进制串或十六进制串,以便进行进一步的分析或发送给其他设备。 以上是LabVIEW中实现CRC-8校验的大致框图。开发者可以根据具体需求和实际情况进行更详细的设计和实现。LabVIEW提供了一系列的函数和工具,使得CRC校验的实现相对简单并且灵活。 ### 回答2: LabVIEW CRC8校验框图可以用以下方式实现。 首先,我们需要一个输入字节的注册表,注册表的位数为8位。使用一个包含8个元素的布尔型一维数组来表示寄存器。 接下来,我们需要一个CRC多项式,用于生成校验码。CRC多项式通常是一个二进制数,比如0x07。我们可以使用一个8位元素的布尔型一维数组来表示CRC多项式。 然后,我们将输入字节与寄存器的最高位进行异或运算,并将结果存储在一个临时变量中。 接下来,我们将寄存器的每一位向右移动一位,并将临时变量放入寄存器最低位。 然后,我们检查寄存器的最高位是否为1,如果是,则进行下一步操作。 我们需要将CRC多项式与寄存器进行异或运算,并将结果存储在寄存器中。 然后,我们重复以上步骤,直到处理完所有字节。 最后,我们将寄存器的值作为校验码输出。 这个LabVIEW CRC8校验框图的基本原理就是按照CRC多项式生成校验码的步骤进行计算,并将结果存储在寄存器中。整个过程可以使用循环结构来实现,以便处理多个字节的输入数据。 ### 回答3: 在LabVIEW中使用CRC8进行校验的过程可以通过以下步骤来实现: 首先,生成CRC8多项式的查找表。通过计算并存储每个可能输入值的输出CRC8校验值,以便在实际校验时使用。 然后,将要校验的数据输入到一个循环中。循环会逐个读取数据的每个字节,并将其作为输入传递给CRC8校验模块。 在CRC8校验模块中,首先需要初始化CRC8校验值。这可以通过将一个预定义的初始值加载到一个变量中来实现。 随后,循环中的每个字节都会被逐个输入到CRC8校验模块中。在每个循环迭代中,校验模块将当前的CRC8校验值与当前输入字节进行异或运算。 接下来,利用CRC8多项式查找表,将校验模块的输出与该字节的所有可能值进行查找,并加载相应的CRC8校验值。 最后,将输出的CRC8校验值与预期的校验值进行比较,以判断输入数据的完整性和准确性。 整个过程的框图可以如下所示: _____________ | | Data ----->| 循环开始 |-----> CRC8校验模块 ----->| 比较校验值 | |_____________| | ↓ CRC8多项式查找表 这个框图说明了在LabVIEW中使用CRC8进行校验的基本过程。通过逐个字节输入数据,并在校验模块中进行异或运算和查找,可以计算出输入数据的CRC8校验值,并与预期值进行比较,以验证数据的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值