# 校驗算法
### 常見的校驗算法
-----------------------------
- 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
