前言
本文CRC的计算结果可与以下网站进行对比:
-
CRC(循环冗余校验)在线计算_ip33.com
-
CRC在线计算
-
模2除法(CRC)循环冗余校验码在线计算器
一. CRC算法的参数说明与计算步骤
前文已经说明了CRC算法的核心是模2除法,但目前广泛使用的CRC算法在进行模2除法之前和之后,还有一些反转或异或的操作。相关参数说明如下:
参数 | 概念 | 示例 | 作用 |
---|---|---|---|
|
|
|
|
|
|
0x1234 (二进制:00010010_00110100 )反转后为 0x482C (二进制:01001000_00101100 ) |
|
|
|
0xFFFFFFFF |
|
|
|
0x1234 (二进制:0001 0010 0011 0100 )反转后为 0x2C48 (二进制0010 1100 0100 1000 ) |
|
|
|
0x12345678 与结果异或值 0xFFFFFFFF 异或后为 0xEDCBA987 |
|
计算CRC的步骤:(输入数据按字节进行位反转) → 在数据低位扩充CRC宽度个0 → 数据高位与初始数据高位异或值INIT异或 → 与生成多项式进行模2除法 → 得到余数即为CRC码 → (CRC码整体进行位反转) → 与结果异或值进行异或 → 最终CRC码。
注意:
-
输入数据非整数字节则高位补0到整数个字节。 -
()表示可选操作,有的CRC算法需要反转,有的不需要。 -
初始值为全0,则无需添加到数据高位,初始值全1才会对计算产生影响 -
与全0异或等价于原样保留,与全1异或等价于每位取反。
计算CRC的步骤总结如下图所示。虚线框表示可选步骤。
二. 特别注意——初始数据高位异或值
初始数据高位异或值,INIT,简称初始异或值
或初始值
,这个参数并不是什么CRC寄存器的初始值
,而是要与输入数据高位异或的初始值
。在后续文章中,会介绍CRC模2算法就相当于左移线性反馈移位寄存器(Linear Feedback Shift Register,简称LSFR)对每一位数据进行从高位到低位的左移反馈运算,如下图所示。
如果将这里的INIT理解为CRC寄存器初始值,当初始值为全1,对输入数据进行移位反馈运算得到的结果必然是错误的
。它就不是CRC寄存器初始值,而是要与补0后的输入数据高位异或的值,弄懂了这一点才能算对CRC,后续博客中在编写算法,推导CRC公式时也会有相关说明。
三. CRC算法计算示例
手算时注意10进制和16进制的对应关系。
3.1 以CRC-8为例
CRC-8 参数为:
-
多项式: 0x07
-
输入反转: False
-
初始异或值: 0x00
-
输出反转: False
-
结果异或值: 0x00
假设输入数据为 0x1234
,计算其 CRC 值:
-
输入反转:REFIN 为 False,输入保持原样;
-
高位与初始值异或:初始值全0,输入保持原样;
-
输入低位补0:
0x123400
; -
模2除多项式0x107:
0x123400 模2÷ 0x107
=0xF1
; -
输出反转:REFOUT为False,不进行输出反转;
-
输出异或:XOROUT全0,输出保持原样;
-
最终 CRC 值为
0xF1
。
用直接算CRC的网站和仅算模2除法的网址进行对比验证,结果如下:
3.2 以CRC-8-ROHC为例
CRC-8-ROHC 参数为:
-
多项式: 0x07
-
输入反转: True
-
初始异或值: 0xFF
-
输出反转: True
-
结果异或值: 0x00
假设输入数据为 0x1234
,计算其 CRC 值:
-
输入反转:REFIN 为 True,输入按字节进行反转, 0x12
二进制0001_0010,反转为0100_1000对应16进制0x48
,0x34
二进制0011_0100,反转为0010_1100对应16进制0x2C
,输入变为0x482C
; -
高位与初始值异或,初始值全1,此时异或等价于按位取反,0x48对应0100_1000,按位取反是1011_0111对应0xB7,输入变为 0xB72C
; -
输入低位补0: 0xB72C00
; -
模2除多项式0x107, 0xB72C00 模2÷ 0x107
=0xE0
; -
输出反转,REFOUT为True,输出整体反转,0xE0二进制1110_0000反转为0000_0111,对应 0x07
; -
输出异或:XOROUT全0,输出保持原样; -
最终 CRC 值为 0x07
。
用直接算CRC的网站和仅算模2除法的网址进行对比验证,结果如下:
四. 流行的CRC算法总结
|
|
|
|
|
|
|
---|---|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
00000001B |
|
|
|
|
|
|
A9EA3693 |
|
|
|
|
|
|
A9EA3693 |
|
|
|
|
五. CRC算法的应用场景
|
|
|
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
没有回复内容