CRC校验算法即循环冗余校验算法,利用除法及余数的原理,实现错误侦测的功能,主要用来检测或校核数据传输或者保存后可能出现的错误。CRC算法有很多种,比如CRC32、CRC16等等。下面我们就来了解一下CRC16算法。

CRC16算法简介

CRC16算法使用16次方的多项式来生成校验和,该算法将数据视为一系列位,并对该序列执行位分割运算,使用多项式进行除法运算。这个除法的余数就是CRC16校验和,它被附加到原始数据的末尾。

CRC16算法

CRC16算法的计算原理

  1. 根据CRC16的标准选择初值CRCIn的值。
  2. 将数据的第一个字节与CRCIn高8位异或。
  3. 判断最高位,若该位为 0 左移一位,若为 1 左移一位再与多项式Hex码异或。
  4. 重复3直至8位全部移位计算结束。
  5. 重复将所有输入数据操作完成以上步骤,所得16位数即16位CRC校验码。

CRC16算法

CRC16算法的计算过程

  1. 预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
  2. 把第一个8位二进制数据 (即通讯信息帧的第一个字节)与16位的CRC寄存器的第8位相异或,把结果放于CRC寄存器;
  3. 把CRC寄存器的内容右移一位(最低位)用0填补最高位,并检查右移后的移出位;
  4. 如果移出位为0:重复第3步(再次右移一位);如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;(Modbus)
  5. 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
  6. 重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
  7. 将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换;
  8. 最后得到的CRC寄存器内容即为:CRC码。

CRC16算法的变体

CRC16算法有以下几种常见变体,它们算法原理基本一致,就是在数据的输入和输出有所差异:

  • CRC16_CCITT:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0x0000异或。
  • CRC16_CCITT_FALSE:多项式x16+x12+x5+1(0x1021),初始值0xFFFF,低位在后,高位在前,结果与0x0000异或。
  • CRC16_XMODEM:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在后,高位在前,结果与0x0000异或。
  • CRC16_X25:多项式x16+x12+x5+1(0x1021),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或。
  • CRC16_MODBUS:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0x0000异或。
  • CRC16_IBM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0x0000异或。
  • CRC16_MAXIM:多项式x16+x15+x2+1(0x8005),初始值0x0000,低位在前,高位在后,结果与0xFFFF异或。
  • CRC16_USB:多项式x16+x15+x2+1(0x8005),初始值0xFFFF,低位在前,高位在后,结果与0xFFFF异或。

CRC16算法

CRC16算法的应用

CRC16常用于通信协议中,当接收到数据时,接收器可以使用相同的算法计算自己的校验和,并将其与接收到的数据一起进行比较。如果两个校验和匹配,数据被认为是无误的。如果它们不匹配,就假定在传输过程中发生了错误,数据可能需要重新传输。

免责声明:素材源于网络,如有侵权,请联系删稿。