循环冗余码校验英文名称为 Cyclical Redundancy Check,简称 CRC,它具有更高性能 的检错能力。CRC 利用除法余数的原理来检测错误, 它将两个字节数据流进行二进制除法 (没有进位,使用 XOR 来代替减法)计算,其实余数称为校验码或者冗余码。发送数据时, 发送方在原始数据后面增加冗余码形成一个新的比特串,然后进行发送。 发送端得计算过程可以表示为公式(1.1).



(1.1)



其中:



(1.2)




表示原始的待发送的二进制数据,



是收发双方事先约定好的多项式,





的长度减1。接收端收到数据后,用收到的数据和



相除,如果余数为零则表示传输过程中没有出错,如果余数不为零则表示传输过程中出现错误。





android CRC 16校验不足位 crc校验错误_校验码


CRC发送和接收算过程如图1.10所示,发送方得到数后,利用除法计算获得冗余码,然后把冗余码添加到数据后面得到实际的发送码进行发送。接收方收到数据后进行进行除法计算,如果余数等于零,就认为数据没有发生错误,如果余数不等于零,就认为数据在传输的过程中发生了错误。

例如:待发送数据



,CRC发送码的计算过程如下:


  1. 计算冗余码的长度。因为多项式 ,长度为4,冗余码 的长度等于多项式长度减1,所以 。
  2. 计算 。
  3. 。除法计算中使用异或运算,最后的余数保留3位,该余数就是冗余码,也被称为校验码。激素然的过程如图1.11所示。
  4. 发送码


android CRC 16校验不足位 crc校验错误_校验码_02


假设接收方收到数据为



仍然是


。接收方对这两个数据进行除法计算


,最后余数等于0,说明传输过程中没有发生错误。 如果在传输的过程第4个比特发生了错误,接收方实际收到的数据是


,计算


余数不等于0,说明数据发生了错误。