问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

简述CRC16算法

创作时间:
作者:
@小白创作中心

简述CRC16算法

引用
1
来源
1.
https://www.jiamisoft.com/blog/34011-crc16.html

CRC16算法是一种常用的循环冗余校验算法,广泛应用于数据传输和存储的错误检测。本文将详细介绍CRC16算法的原理、计算过程及其各种变体,帮助读者深入了解这一重要的数据校验技术。

CRC16算法简介

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

CRC16算法的计算原理

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

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号