首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

CRC 循環冗餘校驗程序設計與 C++ 實作詳解

     編輯:關於C語言

前言

循環冗餘檢驗(CRC)是資料傳輸與儲存中廣泛使用的錯誤檢測機制。本文將從原理分析、軟體設計到程式碼實作,完整記錄一個基於 CRC-8 標準的校驗模擬程序開發過程,幫助讀者深入理解 CRC 算法並掌握其工程落地技巧。

一、 需求分析

開發一個 CRC 校驗模擬程式,功能需求如下:

  • 輸入:一串二進制位元串(如 101001110100001)
  • 輸出:對應的 CRC 校驗碼(如 CRC-8 下的 10001100)

程式需提供圖形化介面,方便使用者輸入資料並即時獲得結果。

二、 CRC 校驗原理深度解析

2.1 數學基礎

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 校驗碼。

2.2 程式實現視角的除法運算

多項式除法在二進制下等價於異或(XOR)運算。以 11001 ÷ 10101 為例:

XOR 除法示意圖

逐位對齊、異或、下移,直到被除數長度小於除數,最終餘數即為結果。

2.3 CRC-8 實例演示

採用國際標準 CRC-8:h(x) = x⁸ + x⁷ + x⁶ + x⁴ + x² + 1,對應二進制 111010101(9 位)。

對資料 101001110100001 進行迭代運算:

CRC-8 迭代運算過程

最終得到校驗碼 r = 10001100。

三、 總體設計

設計決策說明
算法標準選用 CRC-8,原理具代表性,易於擴展至 CRC-16/32
開發語言C++,利用 STL deque<bool> 高效實現位元隊列操作
UI 框架Visual C++ MFC 對話框程式,含輸入/輸出編輯框

四、 詳細設計

4.1 資料結構設計

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;  // 介面輸出字串

4.2 模組劃分與職責

模組結構圖

  • 輸入模組:獲取字串、驗證合法性(僅含 0/1)
  • 寄存器初始化:字串→布林隊列,取前 9 位進入工作寄存器
  • 校驗碼計算核心:工作寄存器與 hx 逐位異或
  • 移位補位模組:工作寄存器隊首連續 0 出隊,從剩餘寄存器補齊同等長度
  • 顯示模組:最終工作寄存器內容轉為字串輸出

4.3 程式流程圖

程式流程圖

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

五、 程式運行驗證

程式執行介面

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

輸入驗證測試

程式並內建輸入合法性檢查,非二進制字元會提示錯誤。

六、 總結與擴展

本專案完整演示了從數學原理到工程實作的轉化過程。關鍵技術點:

  1. 多項式除法↔異或運算的等價轉換
  2. deque<bool> 實現動態位元隊列,高效支援移位補位
  3. MFC 對話框快速構建互動介面

擴展方向:支援 CRC-16/32/64 多標準切換、檔案批次校驗、查表法優化運算速度。


本文出自 “對影成三人” 博客,請務必保留此出處 https://ticktick.blog.51cto.com/823160/176981

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved