CRC冗余校驗舉例和原理

什么是CRC校驗?
CRC即循環冗余校驗碼:是數據通信領域中最常用的一種查錯校驗碼,其特征是信息字段和校驗字段的長度可以任意選定。循環冗余檢查(CRC)是一種數據傳輸檢錯功能,對數據進行多項式計算,并將得到的結果附在幀的后面,接收設備也執行類似的算法,以保證數據傳輸的正確性和完整性。

CRC校驗原理:
其根本思想就是先在要發送的幀后面附加一個數(這個就是用來校驗的校驗碼,但要注意,這里的數也是二進制序列的,下同),生成一個新幀發送給接收端。當然,這個附加的數不是隨意的,它要使所生成的新幀能與發送端和接收端共同選定的某個特定數整除(注意,這里不是直接采用二進制除法,而是采用一種稱之為“2除法”)。到達接收端后,再把接收到的新幀除以(同樣采用“2除法”)這個選定的除數。因為在發送端發送數據幀之前就已通過附加一個數,做了“去余”處理(也就已經能整除了),所以結果應該是沒有余數。如果有余數,則表明該幀在傳輸過程中出現了差錯。
模2除法:
模2除法與算術除法類似,但每一位除的結果不影響其它位,即不向上一位借位,所以實際上就是異或。在循環冗余校驗碼(CRC)的計算中有應用到模2除法。
例:
CRC校驗步驟:
CRC校驗中有兩個關鍵點,一是預先確定一個發送送端和接收端都用來作為除數的二進制比特串(或多項式),可以隨機選擇,也可以使用國際標準,但是最高位和最低位必須為1;二是把原始幀與上面計算出的除數進行模2除法運算,計算出CRC碼。

具體步驟:
1. 選擇合適的除數
2. 看選定除數的二進制位數,然后再要發送的數據幀上面加上這個位數-1位的0,然后用新生成的幀以模2除法的方式除上面的除數,得到的余數就是該幀的CRC校驗碼。注意,余數的位數一定只比除數位數少一位,也就是CRC校驗碼位數比除數位數少一位,如果前面位是0也不能省略。
3. 將計算出來的CRC校驗碼附加在原數據幀后面,構建成一個新的數據幀進行發送;最后接收端在以模2除法方式除以前面選擇的除數,如果沒有余數,則說明數據幀在傳輸的過程中沒有出錯。

CRC校驗碼計算示例:
現假設選擇的CRC生成多項式為GX= X4?+ X3?+ 1,要求出二進制序列10110011CRC校驗碼。下面是具體的計算過程:

①將多項式轉化為二進制序列,由GX = X4?+ X3?+ 1可知二進制一種有五位,第4位、第三位和第零位分別為1,則序列為11001
②多項式的位數位5,則在數據幀的后面加上5-1位0,數據幀變為101100110000,然后使用模2除法除以除數11001,得到余數。
③將計算出來的CRC校驗碼添加在原始幀的后面,真正的數據幀為101100110100,再把這個數據幀發送到接收端。
④接收端收到數據幀后,用上面選定的除數,用模2除法除去,驗證余數是否為0,如果為0,則說明數據幀沒有出錯。





https://blog.csdn.net/d_leo/article/details/73572373

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382628.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

100篇打點!

原創終于到100了&#xff0c;寫一篇博客打點。在記錄一個很嚴重的問題&#xff0c;昨天面試&#xff0c;程序的思路都有了&#xff0c;可是在線OJ半天無法將多個字符串輸入并保存&#xff0c;遍歷。現在記錄一下方法&#xff01; #include <stdio.h> #include <stdli…

排序算法1快速排序

文章沒有解釋和代碼注釋&#xff0c;代碼經改進&#xff0c;做成了好理解,關鍵是好記憶的方式進行書寫。用于自己進行查閱 #include <stdio.h>void sort(int arr[] ,int left ,int right) {if(left > right)return;int i left;int j right;int get arr[right];whi…

C++ 多態原理初步01

當父類 Animal 的speak 前面加上 virtual 關鍵字之后&#xff0c;這個speak函數就變成了虛函數&#xff0c;Animal類結構發生了變化&#xff0c; 有了一個vfptr &#xff08;虛函數指針&#xff09;&#xff0c;指向了vftable&#xff08;虛函數表&#xff09;, 這個虛函數表里…

排序算法2歸并排序

文章沒有解釋和代碼注釋&#xff0c;代碼經改進&#xff0c;做成了好理解,關鍵是好記憶的方式進行書寫。用于自己進行查閱 #include <stdio.h>void merge(int arr1[],int left ,int mid ,int right) {int temp[sizeof(arr1)];int i left ;int j mid 1;int t 0;while…

C++ 多態之純虛函數和抽象類01

純虛函數的語法&#xff0c; virtual void func() 0;如果類中有了純虛函數&#xff0c; 那么這個類也成為抽象類抽象類無法實例化對象繼承了抽象類的子類&#xff0c;必須要重寫父類中的純虛函數&#xff0c;否則的話&#xff0c;子類也是屬于抽象類&#xff0c;無法實例化

堆排序面試

#文章沒有解釋和代碼注釋&#xff0c;代碼經改進&#xff0c;做成了好理解,關鍵是好記憶的方式進行書寫。用于自己進行查閱 #include <stdio.h>void swap(int arr[],int i,int j) {int temp arr[i];arr[i] arr[j];arr[j] temp; }void heapify(int arr[],int i,int si…

C++ 多態之虛析構與純虛擬購01

class Animal { public:Animal(){cout << "Animal的構造函數調用" << endl;}//虛析構 解決的問題是 當子類中有堆區內容&#xff0c;釋放時候對導致釋放不干凈&#xff0c;內存泄露//virtual ~Animal()//{// cout << "Animal的析構函數調用&…

面向對象與面向過程的本質的區別

https://blog.csdn.net/jerry11112/article/details/79027834 如果你很想搞明白面向對象是什么&#xff0c;面向過程是什么&#xff0c;或者說二者之間的區別是什么&#xff0c;那么就花費一點時間來研讀一下這篇博客&#xff0c;你一定會有很大的收獲的&#xff01; 一、面向…

C++ 向上轉型初步01

1.編譯器通過指針來訪問成員變量&#xff0c;指針指向哪個對象就使用哪個對象的數據&#xff1b;編譯器通過指針的類型來訪問成員函數&#xff0c;指針屬于哪個類的類型就使用哪個類的函數。 但是父類 函數如果變成虛函數&#xff0c;子類重寫了這個函數&#xff0c; 那么現象…

虛函數和純虛函數詳解

https://mp.weixin.qq.com/s?__bizMzAxNzYzMTU0Ng&mid2651289202&idx1&sn431ffd1fae4823366a50b68aed2838d4&chksm80114627b766cf31f72018ef5f1fe29591e9f6f4bd72018e7aea849342ca6f0a271fb38465ae#rd 打開鏈接看。轉載文章&#xff0c;注明出處 <p>學…

C++ 繼承中的同名成員的情況01

class Base { public:Base(){this->m_A 100;}void func(){cout << "Base中的Func調用" << endl;}void func(int a){cout << "Base中的Func(int a)調用" << endl;}int m_A; }; class Son : public Base { public:Son(){this-&g…

進程前臺運行后臺運行的相關命令

command& 讓進程在后臺運行jobs 查看后臺運行的進程fg %n 讓后臺運行的進程n到前臺來bg %n 讓進程n到后臺去&#xff1b; ctrl z 可以將一個正在前臺執行的命令放到后臺&#xff0c;并且暫停

西安電子科技大學求職打點

這兩天 一直在西安電子科技大學找工作&#xff0c;感覺自己漸漸失去了學習的狀態&#xff0c;本來很 多會的知識點都已經不會了。   今天休息一天&#xff0c;沒有去招聘會&#xff0c;看了看相關的知識&#xff0c;做了做題。也希望自己盡快恢復學習的感覺&#xff0c;溫故…

C++ 泛型編程模板 之 函數模板初步01

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std;void mySwapInt(int &a, int &b) {int temp a;a b;b temp; } void mySwapDouble(double &a, double &b) {double temp a;a b;b temp; } //利用模板實現通用交換函數 temp…

grep參數說明及常用用法

grep參數說明及常用用法 查看文件內容 [koulocalhost ~]$ more size.txt b124230 b034325 a081016 m7187998 m7282064 a022021 a061048 m9324822 b103303 a013386 b044525 m8987131 B081016 M45678 B103303 BADc2345 [] : 查看符合范圍內的信息 [koulocalho…

C++ 普通函數與函數模板 區別以及調用規則01

//普通函數 和 函數模板 區別 int myPlus(int a, int b) {return a b; }template<class T> T myPlus2(T a, T b) {return a b; }void test01() {int a 10;int b 20;char c c;cout << myPlus(a, c) << endl; //隱式類型轉換 將 char c轉為 int類型//myP…

C++ 模板的局限性以及解決01

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #include <string>class Person { public:Person(string name, int age){this->m_Name name;this->m_Age age;}string m_Name;int m_Age; };//通過模板進行兩個數據比較 templat…

進程的狀態與種類

● 運行&#xff1a;正占用處理器   ● 就緒&#xff1a;只要獲得處理器即可運行。   ● 阻塞&#xff1a;正等待某個事件&#xff08;如I/O完成&#xff09;的發生。  在不少系統中&#xff0c;還增加了兩種基本狀態&#xff1a;   ● 新狀態&#xff1a;一個進程剛剛…

C++ 類模板語法初步01

#define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; #include <string> //類模板 //template下面緊跟著的內容是類&#xff0c;那么這個類稱為 類模板 // 類模板中的類型 也可以有默認參數 // 泛型編程 類型參數化template<class NAM…

int * p =NULL;和*p =NULL的區別a和a的區別

1.int * p NULL;和*p NULL的區別 1 .int * p NULL int *pNULL&#xff1b;定義一個指針變量p&#xff0c;其指向的內存里面保存的是int類型的數據&#xff1b;再定義變量p的同時把p的值設置為0x00000000&#xff0c; 而不是把*p的值設置為0x00000000 2.*p NULL int i 10&am…