# 校验算法
### 常见的校验算法
-----------------------------
- LRC
- BCC
- CRC
### LRC
-----------------------------
- 简介
- 纵向冗余校验(Longitudinal Redundancy Check,简称:LRC)是通信中常用的一种校验形式,也称LRC校验或纵向校验。它是一种从纵向通道上的特定比特串产生校验比特的错误检测方法。在行列格式中(如磁带),LRC经常是与VRC一起使用,这样就会为每个字符校验码。在工业领域Modbus协议Ascii模式采用该算法。
- 具体算法如下
1. 对需要校验的数据(2n个字符)两两组成一个16进制的数值求和。
2. 将求和结果与256求模。
3. 用256减去所得模值得到校验结果(另一种方法:将模值按位取反然后加1)。
- 算法举例
```
例如16进制数据:01 A0 7C FF 02
(16进制计算)
求和:01 + A0 + 7C + FF + 02 = 21E
取模:21E % 100 = 1E
计算:100 - 1E = E2
(10进制计算)
求和:01 + 160 + 124 + 255 + 02 = 542
取模:542 % 256 = 30
计算:256 - 30 = 226
```
### BCC
-----------------------------
- 简介
- BCC(Block Check Character/信息组校验码),因校验码是将所有数据异或得出,故俗称异或校验。
- 具体算法
- 将每一个字节的数据(一般是两个16进制的字符)进行异或后即得到校验码。
- 算法举例
```
例如16进制数据:01 A0 7C FF 02
计算:01 xor A0 xor 7C xor FF xor 02 = 20
校验码是:20
```
### CRC
-----------------------------
- 简介
- CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。j
- 具体算法
- 依赖于选用的多项式
- 算法参数模型
- NAME:参数模型名称。
- WIDTH:宽度,即CRC比特数。
- POLY:生成项的简写,以16进制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成项是0x104C11DB7。
- INIT:这是算法开始时寄存器(crc)的初始化预置值,十六进制表示。
- REFIN:待测数据的每个字节是否按位反转,True或False。
- REFOUT:在计算后之后,异或输出之前,整个数据是否按位反转,True或False。
- XOROUT:计算结果与此参数异或后得到最终的CRC值。
- 算法参数模型
```
CRC算法名称 多项式公式 宽度 多项式 初始值 结果异或值 输入值反转 输出值反转
CRC-4/ITU 4+x+1 4 03 00 00 true true
CRC-5/EPC 4+x3+1 5 09 09 00 false false
CRC-5/ITU 5+x4+x2+1 5 15 00 00 true true
CRC-5/USB 5+x2+1 5 05 1F 1F true true
CRC-6/ITU 6+x+1 6 03 00 00 true true
CRC-7/MMC 7+x3+1 7 09 00 00 false false
CRC-8 8+x2+x+1 8 07 00 00 false false
CRC-8/ITU 8+x2+x+1 8 07 00 55 false false
CRC-8/ROHC 8+x2+x+1 8 07 FF 00 true true
CRC-8/MAXIM 8+x5+x4+1 8 31 00 00 true true
CRC-16/IBM 16+x15+x2+1 16 8005 0000 0000 true true
CRC-16/MAXIM 16+x15+x2+1 16 8005 0000 FFFF true true
CRC-16/USB 16+x15+x2+1 16 8005 FFFF FFFF true true
CRC-16/MODBUS 16+x15+x2+1 16 8005 FFFF 0000 true true
CRC-16/CCITT 16+x12+x5+1 16 1021 0000 0000 true true
CRC-16/CCITT-FALSE 16+x12+x5+1 16 1021 FFFF 0000 false false
CRC-16/X25 16+x12+x5+1 16 1021 FFFF FFFF true true
CRC-16/XMODEM 16+x12+x5+1 16 1021 0000 0000 false false
CRC-16/DNP 16+x13+x12+x11+x10+x8+x6+x5+x2+1 16 3D65 0000 FFFF true true
CRC-32 32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 32 04C11DB7 FFFFFFFF FFFFFFFF true true
CRC-32/MPEG-2 32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 32 04C11DB7 FFFFFFFF 00000000 false false
```
常见CRC参数模型如下:
CRC算法名称 | 多项式公式 | 宽度 | 多项式 | 初始值 | 结果异或值 | 输入值反转 | 输出值反转 |
---|---|---|---|---|---|---|---|
CRC-4/ITU | 4+x+1 | 4 | 03 | 00 | 00 | true | true |
CRC-5/EPC | 4+x3+1 | 5 | 09 | 09 | 00 | false | false |
CRC-5/ITU | 5+x4+x2+1 | 5 | 15 | 00 | 00 | true | true |
CRC-5/USB | 5+x2+1 | 5 | 05 | 1F | 1F | true | true |
CRC-6/ITU | 6+x+1 | 6 | 03 | 00 | 00 | true | true |
CRC-7/MMC | 7+x3+1 | 7 | 09 | 00 | 00 | false | false |
CRC-8 | 8+x2+x+1 | 8 | 07 | 00 | 00 | false | false |
CRC-8/ITU | 8+x2+x+1 | 8 | 07 | 00 | 55 | false | false |
CRC-8/ROHC | 8+x2+x+1 | 8 | 07 | FF | 00 | true | true |
CRC-8/MAXIM | 8+x5+x4+1 | 8 | 31 | 00 | 00 | true | true |
CRC-16/IBM | 16+x15+x2+1 | 16 | 8005 | 0000 | 0000 | true | true |
CRC-16/MAXIM | 16+x15+x2+1 | 16 | 8005 | 0000 | FFFF | true | true |
CRC-16/USB | 16+x15+x2+1 | 16 | 8005 | FFFF | FFFF | true | true |
CRC-16/MODBUS | 16+x15+x2+1 | 16 | 8005 | FFFF | 0000 | true | true |
CRC-16/CCITT | 16+x12+x5+1 | 16 | 1021 | 0000 | 0000 | true | true |
CRC-16/CCITT-FALSE | 16+x12+x5+1 | 16 | 1021 | FFFF | 0000 | false | false |
CRC-16/X25 | 16+x12+x5+1 | 16 | 1021 | FFFF | FFFF | true | true |
CRC-16/XMODEM | 16+x12+x5+1 | 16 | 1021 | 0000 | 0000 | false | false |
CRC-16/DNP | 16+x13+x12+x11+x10+x8+x6+x5+x2+1 | 16 | 3D65 | 0000 | FFFF | true | true |
CRC-32 | 32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 | 32 | 04C11DB7 | FFFFFFFF | FFFFFFFF | true | true |
CRC-32/MPEG-2 | 32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1 | 32 | 04C11DB7 | FFFFFFFF | 00000000 | false | false |