校驗算法


# 校驗算法


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM