循環冗餘檢驗(CRC)是資料傳輸與儲存中廣泛使用的錯誤檢測機制。本文將從原理分析、軟體設計到程式碼實作,完整記錄一個基於 CRC-8 標準的校驗模擬程序開發過程,幫助讀者深入理解 CRC 算法並掌握其工程落地技巧。
開發一個 CRC 校驗模擬程式,功能需求如下:
101001110100001)10001100)程式需提供圖形化介面,方便使用者輸入資料並即時獲得結果。
CRC 將二進制資料視為多項式係數。例如 15 位資料 g = 101001110100001 可表示為:
g(x) = x¹⁴ + x¹² + x⁹ + x⁸ + x⁷ + x⁵ + 1
發送端將 g(x) 乘以 xᵐ(即在末尾補 m 個 0),再除以雙方約定的 m 階生成多項式 h(x),所得餘式 r(x)(m-1 階)對應的二進制碼即為 CRC 校驗碼。
多項式除法在二進制下等價於異或(XOR)運算。以 11001 ÷ 10101 為例:

逐位對齊、異或、下移,直到被除數長度小於除數,最終餘數即為結果。
採用國際標準 CRC-8:h(x) = x⁸ + x⁷ + x⁶ + x⁴ + x² + 1,對應二進制 111010101(9 位)。
對資料 101001110100001 進行迭代運算:

最終得到校驗碼 r = 10001100。
| 設計決策 | 說明 |
|---|---|
| 算法標準 | 選用 CRC-8,原理具代表性,易於擴展至 CRC-16/32 |
| 開發語言 | C++,利用 STL deque<bool> 高效實現位元隊列操作 |
| UI 框架 | Visual C++ MFC 對話框程式,含輸入/輸出編輯框 |
const int CRC8_HX_LENGTH = 9;
bool hx[CRC8_HX_LENGTH] = {1,1,1,0,1,0,1,0,1}; // H(x) = 111010101
deque<bool> inputReg; // 輸入串寄存器:存放使用者輸入的二進制串
deque<bool> workReg; // 操作串寄存器:存放當前被減數(固定 9 位)
deque<bool> remainReg; // 剩餘串寄存器:存放尚未進入運算的資料
CString m_strInput; // 介面輸入字串
CString m_strOutput; // 介面輸出字串

hx 逐位異或
核心迴路:異或 → 移位補位 → 判斷剩餘資料是否耗盡 → 重複,直到剩餘寄存器為空且工作寄存器最高位為 0。

輸入 101001110100001,輸出 10001100,與手算結果完全一致。

程式並內建輸入合法性檢查,非二進制字元會提示錯誤。
本專案完整演示了從數學原理到工程實作的轉化過程。關鍵技術點:
deque<bool> 實現動態位元隊列,高效支援移位補位擴展方向:支援 CRC-16/32/64 多標準切換、檔案批次校驗、查表法優化運算速度。
本文出自 “對影成三人” 博客,請務必保留此出處 https://ticktick.blog.51cto.com/823160/176981