校验算法

# 校验算法


### 常见的校验算法
-----------------------------
- 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

参考:  http://www.ip33.com/crc.html

原文地址:https://www.cnblogs.com/jiftle/p/9463770.html