循环冗余校验(CRC)的算法

时间:2021-08-22 11:58:31
前几天在书上看到了循环冗余校验(CRC)的介绍
但是介绍的不清楚
不知有哪位大虾可以给俺讲一讲

4 个解决方案

#1


http://www.csdn.net/expert/topic/642/642306.xml?temp=.5551264

#2


错误检测与修正(Error Check & Correct)
  在数字数据通信中,由发送器发送的数据信号祯(Frame)在经由网络传到接收器后,由于多种原因可能导致错误位(bit errors)的出现,因此必须由接收器采取一定的措施探测出所有的错误位,并进而采取一定的措施予以修正。

  一、错误检测的基本原理(Principle of Error Check)
  发送器向所发送的数据信号祯添加错误检验码(Check Bits),并取该错误检测码作为该被传输数据信号的函数;接收器根据该函数的定义进行同样的计算,然后将两个结果进行比较:如果结果相同,则认为无错误位;否则认为该数据祯存在有错误位。

  一般说来,错误检测可能出现三种结果:

 在所传输的数据祯中未探测到,也不存在错误位; 
 所传输的数据祯中有一个或多个被探测到的错误位,但不存在未探测到的错误位; 
 被传输的数据祯中有一个或多个没有被探测到的错误位。 

  显然我们希望尽可能好地选择该检测函数,使检测结果可靠,即:所有的错误最好都能被检测出来;如检测出现无错结果,则应不再存在任何未被检测出来的错误。

  实际采用的错误检测方法主要有两类:奇偶校验(Parity)和CRC循环冗余校验(Cyclic Redundancy Check)。

  二、奇偶校验(Parity)
  1.单向奇偶校验
  单向奇偶校验(Row Parity)由于一次只采用单个校验位,因此又称为单个位奇偶校验(Single Bit Parity)。发送器在数据祯每个字符的信号位后添一个奇偶校验位,接收器对该奇偶校验位进行检查。典型的例子是面向ASCII码的数据信号祯的传输,由于ASCII码是七位码,因此用第八个位码作为奇偶校验位。

  单向奇偶校验又分为奇校验(Odd Parity)和偶校验(Even Parity),发送器通过校验位对所传输信号值的校验方法如下:奇校验保证所传输每个字符的8个位中1的总数为奇数;偶校验则保证每个字符的8个位中1的总数为偶数。

  显然,如果被传输字符的7个信号位中同时有奇数个(例如1、3、5、7)位出现错误,均可以被检测出来;但如果同时有偶数个(例如2、4、6)位出现错误,单向奇偶校验是检查不出来的。

  一般在同步传输方式中常采用奇校验,而在异步传输方式中常采用偶校验。

  2.双向奇偶校验
  为了提高奇偶校验的检错能力,可采用双向奇偶校验(Row and Column Parity),也又称为双向冗余校验(Vertical and Longitudinal Redundancy Checks)。

  图1.4给出了由5个ASCII码字符数据信号及其双向偶校验位组成的典型传输矩阵(其中:前五行各字符的偶校验位组成的校验位列(最右边一列),最下面一行由各列信号位的偶校验位组成),该矩阵右下角的校验位则可按行或按列取校验位。

  传输方向              校验位列

       ←       1  0  1  1  0  1  1  1

     ←        1   1  0  1  0  1  1  1

     ←        0   0  1  1  1  0  1  0

     ←        1   0  0  0  1  0  1  1

     ←       0  1  0  1  1  1  1  1

     ←        1   0  0  0  1  1  1  0 ← 校验位行

图1.4 典型双向偶校验传输矩阵

  显然,如果被传输的字符信号矩阵中同时在偶数个行中的偶数个相同的列中出现错误,双向奇偶校验也是检查不出来的。

  三、CRC循环冗余校验(Cyclic Redundancy Check)
  1.CRC循环冗余校验的基本原理
  发送器和接收器约定选择同一个由n+1个位组成的二进制位列P作为校验列,发送器在数据祯的K个位信号后添加n个位(n<K)组成的FCS祯检验列(Frame Check Sequence),以保证新组成的全部信号列值可以被预定的校验二进制位列P的值对二取模整除;接收器检验所接收到数据信号列值(含有数据信号祯和FCS祯检验列)是否能被校验列P对二取模整除,如果不能,则存在传输错误位。P被称为CRC循环冗余校验列,正确选择P可以提高CRC冗余校验的能力。

  (注:对二取模的四则运算指参与运算的两个二进制数各位之间凡涉及加减运算时均进行XOR异或运算,即:1 XOR 1=0,0 XOR 0=0,1 XOR 0=1)

  可以证明,只要数据祯信号列M和校验列P是确定的,则可以唯一确定FCS祯检验列(也称为CRC冗余检验值)的各个位。

  FCS帧检验列可由下列方法求得:在M后添加n个零后对二取模整除以P所得的余数。

  例如:如要传输的M=7位列为1011101,选定的P校验二进制位列为10101(共有n+1=5位),对应的FCS帧校验列即为用1011101 0000(共有M+n=7+4=11位)对二取模整除以10101后的余数0111(共有n=4位)。因此,发送方应发送的全部数据列为10111010111。接收方将收到的11位数据对二取模整除以P校验二进制位列10101,如余数非0,则认为有传输错误位。

  2.CRC循环冗余校验标准多项式P(X)
  为了表示方便,实用时发送器和接收器共同约定选择的校验二进制位列P常被表示为具有二进制系数(1或0)的CRC标准校验多项式P(X)。

  (1)CRC循环冗余校验常用的标准多项式P(X)

  常用的CRC循环冗余校验标准多项式如下:

  CRC(16位) = X16+X15+X2+1

  CRC(CCITT) = X16+X12 +X5+1

  CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1

  以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。

  注意:这儿列出的标准校验多项式P(X)都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。

  (2)CRC循环冗余校验标准多项式P(X)的检错能力

  CRC循环冗余校验具有比奇偶校验强得多的检错能力。可以证明:它可以检测出所有的单个位错、几乎所有的双个位错、低于P(X)对应二进制校验列位数的所有连续位错、大于或等于P(X)对应二进制校验列位数的绝大多数连续位错。

  但是,当传输中发生的错误多项式E(X)能被校验多项式P(X)对二取模整除时,它就不可能被P(X)探测出来,例如当E(X)=P(X)时。

  四、错误修正(Error Correction)
 对数据信号祯传输过程中的位错进行修正的方法主要有两种:

 由发送器提供错误修正码,然后由接收器自己修正错误; 
 在接收器发现接收到的错误祯中有位错误时,通知发送器重新发送数据信号祯。 

  前一种方法中的错误修正码需要发送器由被传送数据信号祯计算得到,然后添加到数据祯的后面,其长度几乎等于数据位数,导致效率降低50%,实际采用不多;一般采用后一种较为有效的重发送方法。

#3


CRC码的原理主要是用所要发送的信息位模二除预先约定好的生成多项式得到冗余位,然后在信息位后加上此冗余位就得到CRC码。在接受端,只要用此CRC码再次模二除与发送端相同的生成多项式就可以判定信息在传输的过程中有没有出错,如果余数为零,则说明正确,否则说明错误,需要重传。例如:
信息位K(X)=1011001,生成多项式G(X)=11001,则冗余位R=4位(即生成多项式的位数减一),通过模二除可得余数=1010,即冗余位=1010,故CRC=110011010

#4


good,学习

#1


http://www.csdn.net/expert/topic/642/642306.xml?temp=.5551264

#2


错误检测与修正(Error Check & Correct)
  在数字数据通信中,由发送器发送的数据信号祯(Frame)在经由网络传到接收器后,由于多种原因可能导致错误位(bit errors)的出现,因此必须由接收器采取一定的措施探测出所有的错误位,并进而采取一定的措施予以修正。

  一、错误检测的基本原理(Principle of Error Check)
  发送器向所发送的数据信号祯添加错误检验码(Check Bits),并取该错误检测码作为该被传输数据信号的函数;接收器根据该函数的定义进行同样的计算,然后将两个结果进行比较:如果结果相同,则认为无错误位;否则认为该数据祯存在有错误位。

  一般说来,错误检测可能出现三种结果:

 在所传输的数据祯中未探测到,也不存在错误位; 
 所传输的数据祯中有一个或多个被探测到的错误位,但不存在未探测到的错误位; 
 被传输的数据祯中有一个或多个没有被探测到的错误位。 

  显然我们希望尽可能好地选择该检测函数,使检测结果可靠,即:所有的错误最好都能被检测出来;如检测出现无错结果,则应不再存在任何未被检测出来的错误。

  实际采用的错误检测方法主要有两类:奇偶校验(Parity)和CRC循环冗余校验(Cyclic Redundancy Check)。

  二、奇偶校验(Parity)
  1.单向奇偶校验
  单向奇偶校验(Row Parity)由于一次只采用单个校验位,因此又称为单个位奇偶校验(Single Bit Parity)。发送器在数据祯每个字符的信号位后添一个奇偶校验位,接收器对该奇偶校验位进行检查。典型的例子是面向ASCII码的数据信号祯的传输,由于ASCII码是七位码,因此用第八个位码作为奇偶校验位。

  单向奇偶校验又分为奇校验(Odd Parity)和偶校验(Even Parity),发送器通过校验位对所传输信号值的校验方法如下:奇校验保证所传输每个字符的8个位中1的总数为奇数;偶校验则保证每个字符的8个位中1的总数为偶数。

  显然,如果被传输字符的7个信号位中同时有奇数个(例如1、3、5、7)位出现错误,均可以被检测出来;但如果同时有偶数个(例如2、4、6)位出现错误,单向奇偶校验是检查不出来的。

  一般在同步传输方式中常采用奇校验,而在异步传输方式中常采用偶校验。

  2.双向奇偶校验
  为了提高奇偶校验的检错能力,可采用双向奇偶校验(Row and Column Parity),也又称为双向冗余校验(Vertical and Longitudinal Redundancy Checks)。

  图1.4给出了由5个ASCII码字符数据信号及其双向偶校验位组成的典型传输矩阵(其中:前五行各字符的偶校验位组成的校验位列(最右边一列),最下面一行由各列信号位的偶校验位组成),该矩阵右下角的校验位则可按行或按列取校验位。

  传输方向              校验位列

       ←       1  0  1  1  0  1  1  1

     ←        1   1  0  1  0  1  1  1

     ←        0   0  1  1  1  0  1  0

     ←        1   0  0  0  1  0  1  1

     ←       0  1  0  1  1  1  1  1

     ←        1   0  0  0  1  1  1  0 ← 校验位行

图1.4 典型双向偶校验传输矩阵

  显然,如果被传输的字符信号矩阵中同时在偶数个行中的偶数个相同的列中出现错误,双向奇偶校验也是检查不出来的。

  三、CRC循环冗余校验(Cyclic Redundancy Check)
  1.CRC循环冗余校验的基本原理
  发送器和接收器约定选择同一个由n+1个位组成的二进制位列P作为校验列,发送器在数据祯的K个位信号后添加n个位(n<K)组成的FCS祯检验列(Frame Check Sequence),以保证新组成的全部信号列值可以被预定的校验二进制位列P的值对二取模整除;接收器检验所接收到数据信号列值(含有数据信号祯和FCS祯检验列)是否能被校验列P对二取模整除,如果不能,则存在传输错误位。P被称为CRC循环冗余校验列,正确选择P可以提高CRC冗余校验的能力。

  (注:对二取模的四则运算指参与运算的两个二进制数各位之间凡涉及加减运算时均进行XOR异或运算,即:1 XOR 1=0,0 XOR 0=0,1 XOR 0=1)

  可以证明,只要数据祯信号列M和校验列P是确定的,则可以唯一确定FCS祯检验列(也称为CRC冗余检验值)的各个位。

  FCS帧检验列可由下列方法求得:在M后添加n个零后对二取模整除以P所得的余数。

  例如:如要传输的M=7位列为1011101,选定的P校验二进制位列为10101(共有n+1=5位),对应的FCS帧校验列即为用1011101 0000(共有M+n=7+4=11位)对二取模整除以10101后的余数0111(共有n=4位)。因此,发送方应发送的全部数据列为10111010111。接收方将收到的11位数据对二取模整除以P校验二进制位列10101,如余数非0,则认为有传输错误位。

  2.CRC循环冗余校验标准多项式P(X)
  为了表示方便,实用时发送器和接收器共同约定选择的校验二进制位列P常被表示为具有二进制系数(1或0)的CRC标准校验多项式P(X)。

  (1)CRC循环冗余校验常用的标准多项式P(X)

  常用的CRC循环冗余校验标准多项式如下:

  CRC(16位) = X16+X15+X2+1

  CRC(CCITT) = X16+X12 +X5+1

  CRC(32位) = X32+X26+X23+X16+X12+X11+X10+ X8+X7+X5+X4+X2+X+1

  以CRC(16位)多项式为例,其对应校验二进制位列为1 1000 0000 0000 0101。

  注意:这儿列出的标准校验多项式P(X)都含有(X+1)的多项式因子;各多项式的系数均为二进制数,所涉及的四则运算仍遵循对二取模的运算规则。

  (2)CRC循环冗余校验标准多项式P(X)的检错能力

  CRC循环冗余校验具有比奇偶校验强得多的检错能力。可以证明:它可以检测出所有的单个位错、几乎所有的双个位错、低于P(X)对应二进制校验列位数的所有连续位错、大于或等于P(X)对应二进制校验列位数的绝大多数连续位错。

  但是,当传输中发生的错误多项式E(X)能被校验多项式P(X)对二取模整除时,它就不可能被P(X)探测出来,例如当E(X)=P(X)时。

  四、错误修正(Error Correction)
 对数据信号祯传输过程中的位错进行修正的方法主要有两种:

 由发送器提供错误修正码,然后由接收器自己修正错误; 
 在接收器发现接收到的错误祯中有位错误时,通知发送器重新发送数据信号祯。 

  前一种方法中的错误修正码需要发送器由被传送数据信号祯计算得到,然后添加到数据祯的后面,其长度几乎等于数据位数,导致效率降低50%,实际采用不多;一般采用后一种较为有效的重发送方法。

#3


CRC码的原理主要是用所要发送的信息位模二除预先约定好的生成多项式得到冗余位,然后在信息位后加上此冗余位就得到CRC码。在接受端,只要用此CRC码再次模二除与发送端相同的生成多项式就可以判定信息在传输的过程中有没有出错,如果余数为零,则说明正确,否则说明错误,需要重传。例如:
信息位K(X)=1011001,生成多项式G(X)=11001,则冗余位R=4位(即生成多项式的位数减一),通过模二除可得余数=1010,即冗余位=1010,故CRC=110011010

#4


good,学习