一文了解CRC校驗算法知識
三、常見的CRC算法
雖然CRC可以任意定義二項式、數據長度等,但沒有一個統一的標準的話,就會讓整個計算變得非常的麻煩。但實際上,不同的廠家經常采用不同的標準算法,這里列出了一些國際常用的模型表:
名稱多項式表示法應用舉例CRC-8X8+X2+X+10X107
CRC-12X12+X11+X3+X2+X+10X180Ftelecom systemsCRC-16X16+X15+X2+10X18005Bisync, Modbus, USB, ANSI X3.28, SIA DC-07, many others; also known as CRC-16 and CRC-16-ANSICRC-CCITTX16+X12+X5+10X11021ISO HDLC, ITU X.25, V.34/V.41/V.42, PPP-FCSCRC-32X32+X26+X23+X22+X16+X12+X11+X10+X8+X7+X5+X4+X2+X+10x104C11DB7ZIP, RAR, IEEE 802 LAN/FDDI, IEEE 1394, PPP-FCSCRC-32CX32+X28+X27+X26+X25+X23+X22+X20+X19+X18+X14+X13+X11+X10+X9+X8+X6+10x11EDC6F41iSCSI, SCTP, G.hn payload, SSE4.2, Btrfs, ext4, Ceph
四、CRC校驗算法前置知識
在學習CRC校驗算法之前,先復習一下CRC會涉及的主要幾個主要的算法。
1. 異或
異或,就是不同為1,相同為0,運算符號是^。
0^0 = 0
0^1 = 1
1^1 = 0
1^0 = 1
異或運算存在如下幾個規律,需要了解。
0^x = x 即0 異或任何數等于任何數
1^x = ~x 即1異或任何數等于任何數取反
x^x = 0 即任何數與自己異或,結果為0
a ^ b = b ^ a 交換律
a ^ (b ^ c) = (a ^ b) ^c 結合律
2. 模2加法
模2加法相對于普通的算術加法,主要的區別在模2加法,不做進位處理。具體結果如下。0+0 = 00+1 = 11+1 = 01+0 = 1我們發現模2加法的計算結果,同異或運算結果一模一樣。進一步推演,我們會發現,異或運算的5個規律,同樣適合于模2加法。這里,就不在一一列舉了。
3. 模2減法
模2減法相對于普通的算術減法,主要的區別在模2減法,不做借位處理。具體結果如下。0-0 = 00-1 = 11-1 = 01-0 = 1我們發現模2減法的計算結果,同模2加法,以及異或的運算結果一模一樣。進一步推演,我們會發現,異或運算的5個規律,同樣適合于模2減法。這里,就不在一一列舉了。
4. 模2除法
模2除法相對于普通的算術除法,主要的區別在模2除法,它既不向上位借位,也不比較除數和被除數的相同位數值的大小,只要以相同位數進行相除即可。
五、CRC原理
CRC原理:在K位信息碼(目標發送數據)后再拼接R位校驗碼,使整個編碼長度為N位,因此這種編碼也叫(N,K)碼。
通俗的說,就是在需要發送的信息后面附加一個數(即校驗碼),生成一個新的發送數據發送給接收端。這個數據要求能夠使生成的新數據被一個特定的數整除。這里的整除需要引入模 2除法的概念。
那么,CRC校驗的具體做法就是
(1)選定一個標準除數(K位二進制數據串)
(2)在要發送的數據(m位)后面加上K-1位0,然后將這個新數(M+K-1位)以模2除法的方式除以上面這個標準除數,所得到的余數也就是該數據的CRC校驗碼(注:余數必須比除數少且只少一位,不夠就補0)
(3)將這個校驗碼附在原m位數據后面,構成新的M+K-1位數據,發送給接收端。
(4)接收端將接收到的數據除以標準除數,如果余數為0則認為數據正確。
注意:CRC校驗中有兩個關鍵點:
一是要預先確定一個發送端和接收端都用來作為除數的二進制比特串(或多項式);
二是把原始幀與上面選定的除進行二進制除法運算,計算出FCS。
前者可以隨機選擇,也可按國際上通行的標準選擇,但最高位和最低位必須均為“1”
六、循環冗余的計算
實例:
由于CRC-32、CRC-16、CCITT和CRC-4的編碼過程基本一致,只有位數和生成多項式不一樣,下面就舉例,來說明CRC校驗碼生成過程。
對于數據1110 0101(16#E5),以指定除數11011求它的CRC校驗碼,其過程如下:

使用上面計算的校驗和和消息數據,可以創建要傳輸的碼字。

有時候,我們需要填充checksum到制定的位置,這就涉及到字節序問題,建議用memcpy()進行拷貝。
七、代碼實現
實現算法參考網絡相關代碼,進行整理并驗證,可直接使用。crc.c
*一口Linux
*2021.6.21
*version: 1.0.0
#include "crc.h"
#include
crc.h
*一口Linux
*2021.6.21
*version: 1.0.0
#ifndef __CRC_H__
#define __CRC_H__
#include
main.c
*一口Linux
*2021.6.21
*version: 1.0.0
#include
注意
不同的CRC算法,對00H或FFH數據流的計算結果不一樣,部分算法存在校驗結果也為00H或FFH的情況(也就意味著存儲空間處于初始化狀態時:全0或全1,CRC校驗反而是正確的),在應用中需要注意避免。
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
- 1 AI狂歡遇上油價破百,全球股市還能漲多久? | 產聯看全球
- 2 OpenAI深夜王炸!ChatGPT Images 2.0實測:中文穩、細節炸,設計師慌了
- 3 6000億美元估值錨定:字節跳動的“去單一化”突圍與估值重構
- 4 Tesla AI5芯片最新進展總結
- 5 連夜測了一波DeepSeek-V4,我發現它可能只剩“審美”這個短板了
- 6 熱點丨AI“瑜亮之爭”:既生OpenClaw,何生Hermes?
- 7 AI界的殺豬盤:9秒刪庫跑路,全員被封號,還繼續扣錢!
- 8 2026,人形機器人只贏了面子
- 9 DeepSeek降價90%:價格屠夫不是身份,是戰略
- 10 AI Infra產業鏈卡在哪里了?


分享













