CRC算法原理与实现03——参数说明、计算步骤与应用场景-Anlogic-安路社区-FPGA CPLD-ChipDebug

CRC算法原理与实现03——参数说明、计算步骤与应用场景

转自徐晓康的博客
CRC算法原理与实现01——概述
CRC算法原理与实现02——数学原理与模2运算
CRC算法原理与实现03——参数说明、计算步骤与应用场景
CRC算法原理与实现04——软硬件实现方法简介 – 徐晓康的博客
CRC算法原理与实现05——并行计算公式推导
CRC算法原理与实现06——自编Python计算任意CRC
CRC算法原理与实现07——Verilog单步计算任意CRC
CRC算法原理与实现08——Verilog多步计算任意CRC – 徐晓康的博客
CRC算法原理与实现09——C语言计算任意CRC

CRC算法原理与实现

前言

本文CRC的计算结果可与以下网站进行对比:

  1. CRC(循环冗余校验)在线计算_ip33.com

图片[2]-CRC算法原理与实现03——参数说明、计算步骤与应用场景-Anlogic-安路社区-FPGA CPLD-ChipDebug

  1. CRC在线计算

图片[3]-CRC算法原理与实现03——参数说明、计算步骤与应用场景-Anlogic-安路社区-FPGA CPLD-ChipDebug

  1. 模2除法(CRC)循环冗余校验码在线计算器

图片[4]-CRC算法原理与实现03——参数说明、计算步骤与应用场景-Anlogic-安路社区-FPGA CPLD-ChipDebug

一. CRC算法的参数说明与计算步骤

前文已经说明了CRC算法的核心是模2除法,但目前广泛使用的CRC算法在进行模2除法之前和之后,还有一些反转或异或的操作。相关参数说明如下:

参数 概念 示例 作用
多项式POLY(Polynomial)
CRC生成多项式,通常以十六进制表示,此时最高位1省略
CRC-8,x8 + x2 + x + 1,对应二进制1_0000_0111,16进制表示0x07
算法核心,越长检错能力越强
输入反转REFIN(Reflection Input)
是否对输入数据的每个字节进行位反转(最高位变最低位,次高位变次低位,依此类推)
例如,输入数据 0x1234(二进制:00010010_00110100)反转后为 0x482C(二进制:01001000_00101100
简化硬件实现,适应串行通信的位顺序。
初始数据高位异或值INIT(Initial Value)
在输入反转并且补0之后,将数据高位与初始值异或
例如,CRC-32 的初始值为 0xFFFFFFFF
提高对输入数据前导0的敏感性
输出反转REFOUT(Reflection Output)
是否对CRC 值整体进行位反转
例如,CRC 值 0x1234 (二进制:0001 0010 0011 0100)反转后为 0x2C48(二进制0010 1100 0100 1000
提高对某些类型错误(如突发错误)的检测能力
结果异或值XOROUT(XOR Output)
在 CRC 计算与反转完成后,将 CRC 值与结果异或值进行按位异或操作
例如,CRC 值 0x12345678 与结果异或值 0xFFFFFFFF 异或后为 0xEDCBA987
避免全零 CRC 值,提高校验强度

计算CRC的步骤:(输入数据按字节进行位反转) → 在数据低位扩充CRC宽度个0 → 数据高位与初始数据高位异或值INIT异或 → 与生成多项式进行模2除法 → 得到余数即为CRC码 → (CRC码整体进行位反转) → 与结果异或值进行异或 → 最终CRC码。

注意:

  1. 输入数据非整数字节则高位补0到整数个字节。
  2. ()表示可选操作,有的CRC算法需要反转,有的不需要。
  3. 初始值为全0,则无需添加到数据高位,初始值全1才会对计算产生影响
  4. 与全0异或等价于原样保留,与全1异或等价于每位取反。

计算CRC的步骤总结如下图所示。虚线框表示可选步骤。

图片[5]-CRC算法原理与实现03——参数说明、计算步骤与应用场景-Anlogic-安路社区-FPGA CPLD-ChipDebug

二. 特别注意——初始数据高位异或值

初始数据高位异或值,INIT,简称初始异或值初始值这个参数并不是什么CRC寄存器的初始值,而是要与输入数据高位异或的初始值。在后续文章中,会介绍CRC模2算法就相当于左移线性反馈移位寄存器(Linear Feedback Shift Register,简称LSFR)对每一位数据进行从高位到低位的左移反馈运算,如下图所示。

如果将这里的INIT理解为CRC寄存器初始值,当初始值为全1,对输入数据进行移位反馈运算得到的结果必然是错误的。它就不是CRC寄存器初始值,而是要与补0后的输入数据高位异或的值,弄懂了这一点才能算对CRC,后续博客中在编写算法,推导CRC公式时也会有相关说明。

图片[6]-CRC算法原理与实现03——参数说明、计算步骤与应用场景-Anlogic-安路社区-FPGA CPLD-ChipDebug

三. CRC算法计算示例

手算时注意10进制和16进制的对应关系。

图片[7]-CRC算法原理与实现03——参数说明、计算步骤与应用场景-Anlogic-安路社区-FPGA CPLD-ChipDebug

3.1 以CRC-8为例

CRC-8 参数为:

  • 多项式:0x07
  • 输入反转:False
  • 初始异或值:0x00
  • 输出反转:False
  • 结果异或值:0x00

假设输入数据为 0x1234,计算其 CRC 值:

  1. 输入反转:REFIN 为 False,输入保持原样;

  2. 高位与初始值异或:初始值全0,输入保持原样;

  3. 输入低位补0:0x123400

  4. 模2除多项式0x107:0x123400 模2÷ 0x107 = 0xF1

  5. 输出反转:REFOUT为False,不进行输出反转;

  6. 输出异或:XOROUT全0,输出保持原样;

  7. 最终 CRC 值为 0xF1

用直接算CRC的网站和仅算模2除法的网址进行对比验证,结果如下:

图片[8]-CRC算法原理与实现03——参数说明、计算步骤与应用场景-Anlogic-安路社区-FPGA CPLD-ChipDebug

3.2 以CRC-8-ROHC为例

CRC-8-ROHC 参数为:

  • 多项式:0x07
  • 输入反转:True
  • 初始异或值:0xFF
  • 输出反转:True
  • 结果异或值:0x00

假设输入数据为 0x1234,计算其 CRC 值:

  1. 输入反转:REFIN 为 True,输入按字节进行反转,0x12二进制0001_0010,反转为0100_1000对应16进制0x480x34二进制0011_0100,反转为0010_1100对应16进制0x2C,输入变为0x482C
  2. 高位与初始值异或,初始值全1,此时异或等价于按位取反,0x48对应0100_1000,按位取反是1011_0111对应0xB7,输入变为0xB72C
  3. 输入低位补0:0xB72C00
  4. 模2除多项式0x107,0xB72C00 模2÷ 0x107 = 0xE0
  5. 输出反转,REFOUT为True,输出整体反转,0xE0二进制1110_0000反转为0000_0111,对应0x07
  6. 输出异或:XOROUT全0,输出保持原样;
  7. 最终 CRC 值为 0x07

用直接算CRC的网站和仅算模2除法的网址进行对比验证,结果如下:

图片[9]-CRC算法原理与实现03——参数说明、计算步骤与应用场景-Anlogic-安路社区-FPGA CPLD-ChipDebug

四. 流行的CRC算法总结

CRC算法名称
宽度
多项式POLY
初始值INIT
结果异或值XOROUT
输入反转REFIN
输出反转REFOUT
CRC-4-ITU
4
0x03
0x00
0x00
CRC-5-EPC
5
0x09
0x09
0x00
CRC-5-ITU
5
0x15
0x00
0x00
CRC-5-USB
5
0x05
0x1F
0x1F
CRC-6-ITU
6
0x03
0x00
0x00
CRC-7-MMC
7
0x09
0x00
0x00
CRC-8
8
0x07
0x00
0x00
CRC-8-ITU
8
0x07
0x00
0x55
CRC-8-ROHC
8
0x07
0xFF
0x00
CRC-8-MAXIM
8
0x31
0x00
0x00
CRC-16
16
0x8005
0x0000
0x0000
CRC-16-MAXIM
16
0x8005
0x0000
0xFFFF
CRC-16-USB
16
0x8005
0xFFFF
0xFFFF
CRC-16-MODBUS
16
0x8005
0xFFFF
0x0000
CRC-16-CCITT
16
0x1021
0x0000
0x0000
CRC-16-CCITT-FALSE
16
0x1021
0xFFFF
0x0000
CRC-16-X25
16
0x1021
0xFFFF
0xFFFF
CRC-16-XMODEM
16
0x1021
0x0000
0x0000
CRC-16-DNP
16
0x3D65
0x0000
0xFFFF
CRC-32
32
0x04C11DB7
0xFFFFFFFF
0xFFFFFFFF
CRC-32-MPEG-2
32
0x04C11DB7
0xFFFFFFFF
0x00000000
CRC-64-ISO
64
0x00000000
00000001B
64位全0
64位全0
CRC-64-ECMA
64
0x42F0E1EB
A9EA3693
64位全0
64位全0
CRC-64-WE
64
0x42F0E1EB
A9EA3693
64位全1
64位全1

五. CRC算法的应用场景

CRC算法名称
别名
说明
CRC-4-ITU
用于 ITU-T 标准,常见于通信协议中的数据校验。
CRC-5-EPC
用于 EPCglobal 标准,主要用于 RFID 标签的数据校验。
CRC-5-ITU
用于 ITU-T 标准,常见于通信协议中的数据校验。
CRC-5-USB
用于 USB 协议,确保数据传输的完整性。
CRC-6-ITU
用于 ITU-T 标准,常见于通信协议中的数据校验。
CRC-7-MMC
用于 MMC/SD 存储卡协议,确保存储数据传输的完整性。
CRC-8
CRC-8-SAE-J1850
广泛应用于多种场景。
CRC-8-ITU
CRC-8-I-CODE
用于 ITU-T 标准,常见于通信协议中的数据校验。
CRC-8-ROHC
用于 ROHC(鲁棒性头压缩)协议,确保数据头部的完整性。
CRC-8-MAXIM
CRC-8-Dallas,CRC-8-IBUTTON
用于 Maxim 的 1-Wire 总线协议,确保数据传输的可靠性。
CRC-16
CRC-16-IBM,CRC-16-ANSI
广泛应用于多种场景。
CRC-16-MAXIM
CRC-16-Dallas
用于 Maxim 的 1-Wire 总线协议,确保数据传输的可靠性。
CRC-16-USB
用于 USB 协议,确保数据传输的完整性。
CRC-16-MODBUS
用于 Modbus 通信协议,确保工业通信数据的完整性。
CRC-16-CCITT
CRC-CCITT,KERMIT,CRC-16-CCITT-TRUE
广泛用于通信协议中的数据校验。
CRC-16-CCITT-FALSE
XMODEM
用于通信协议,初始值为 0xFFFF,输入输出不反转。
CRC-16-X25
CRC-16-IBM-SDLC,CRC-16-ISO-HDLC
用于 X.25 协议,确保网络层数据传输的完整性。
CRC-16-XMODEM
ZMODEM
常用于文件传输协议(如 XMODEM,ZMODEM)中,确保数据传输的完整性。
CRC-16-DNP
用于 DNP3 协议,确保工业通信数据的完整性。
CRC-32
CRC-32/ADCCP,CRC-32-PKZIP
广泛用于 ZIP,PNG 等文件校验,以及网络协议中的数据完整性校验。
CRC-32-MPEG-2
用于 MPEG-2 协议,确保音视频数据传输的完整性。
CRC-64-ISO
用于 ISO 3309 标准,广泛应用于文件校验和数据库一致性检查。
CRC-64-ECMA
用于 ECMA-182 标准,常见于分布式存储和数据传输协议中。
CRC-64-WE
CRC-64-XZ
通用数据校验(如数据库、文件系统),也用于 XZ Utils 文件压缩工具中的数据校验

 

请登录后发表评论

    没有回复内容