全網最詳細的CRC講解即計算

CRC

循環冗余碼(Cyclic Redundancy Code, CRC)是一種用于校驗通信鏈路上數字傳輸準確性的計算方法(通過某種數學運算來建立數據位和校驗位(CRC)的約定關系的)。它是利用除法以及余數的原理來作錯誤偵測。
發送方: 使用某公式計算出被傳送數據所含信息的一個值,并將此值 附在被傳送數據后。
接收方: 對同一數據進行相同的計算,應該得到相同的結果。對比CRC結果。

數學背景

模二運算

模二運算,是一種二進制的四則運算,包括模二加(+)、模二減(-)、模二乘(x)、模二除(/) 四種二進制運算。與四則運算不同的是模二運算不考慮進位和借位.
模二除法

重點

  1. 模二加法和模二減法的結果是相同的,并且與異或(XOR)運算的結果是一致的。 異或運算可以代替模二加減運算。可用硬件XOR異或門硬件代替運算。
  2. 模二乘法可看作兩個步驟, 可用AND與門代替運算。
    a. 第一步被乘數的位跟乘數進行與運算,再根據被乘數的階進行左移被乘數的階數位,被乘數的位數對應n個部分積。
    b. 部分積進行模二加法運算。
  3. 模二乘除法與普通乘除法一樣演算,區別是模二除法的被除數部分的階數與除數P的階數相同時,進行部分XOR異或運算,得到商數和余數,將余數的階數與除數P循環計算,直到余數的階數小于R,這個余數就是附加的校驗碼。
    關注模二除法,因為它與CRC算法密切相關,它有三個性質:
  4. 當最后余數的位數小于除數位數時,除法停止。
  5. 當被除數的位數小于除數位數時,則商數為0,被除數就是余數。
  6. 只要被除數或部分余數的位數與除數一樣多,且最高位為1,不管其他位是什么數,皆可商1。

二進制多項式

對任意的二進制數都構造與其對應的一個二進制系數多項式
例如:10011B,其對應的二進制系數多項式為P(X) = X^4 +X +1。
CRC算法中,對于二進制數都是以二進制系數多項式去描述的,。
在這里插入圖片描述

CRC算法

CRC 算法的基本思想是將要傳輸數據后面填充N個0(既是傳輸數據信息左移N位)當做一個包含數據的多項式。將左移后的數據多項式 模二除以另一個生成多項式(Poly),得到的余數作為(CRC)校驗數據附加到原數據后面。(模二除,CRC取余)
在這里插入圖片描述
在這里插入圖片描述

g(x)為校驗碼的生成多項式(上文中,除數的二級制多項式poly),不同的位數的CRC多項式,對應生成多項式的次冪不同,其糾錯能力也不同。常見的標準多項式如下。
在這里插入圖片描述

CRC-8算法為例,該算法生成多項式G(X)為在這里插入圖片描述
.除數p(x)為0b10000 0111。

CRC算法參數模型

NAME:參數模型名稱,決定了CRC位寬和POLY生成多項式。
WIDTH:寬度,即CRC位數。
POLY:生成項的簡寫,以16進制表示。例如:CRC-32即是0x04C11DB7,忽略了最高位的"1",即完整的生成項是0x104C11DB7。
INIT:這是計算CRC循環冗余碼時,在數據后面預填充的預置值,十六進制表示。
REFIN:控制輸入數據是否進行反轉操作,True或False。若False,則輸入數據的比特順序反轉,通常是將最高有效位(MSB)變為最低有效位(LSB)。
REFOUT:控制輸出CRC校驗值是否進行反轉操作。在計算左移后數據多項式模二除以生成多項式后,余數(即CRC校驗值)是否按位反轉,True或False。
XOROUT:計算結果與此參數異或后得到最終的CRC值。

數據m(x)=0x31 ,CRC-8算法為例,該算法生成多項式G(X)為在這里插入圖片描述
.除數p(x)為0b10000 0111。數據m(x)左移八位即x8m(x)=0x3100。 p(x) 模二除以x8m(x)的余數為0x97.

以CRC-16/DNP算法為例,
● 多項式公式G(X)為x16 + x13 + x12 + x11 + x10 + x8 + x6 + x5 + x2 + 1,除數為p(x)=0x13D65= 0b10011 1101 0110 0101。
● 數據m(x)為=0x31=0b0011 0001。由于CRC-16/DNP模型的輸入數據反轉,其值RefIn m(x) =0b1000 1100 =0x8C。數據m(x)左移16位即x16RefInm(x)=0x8C0000。
● x16RefIn m(x) = 0x8C0000模二除以p(x) = 0x13D65 的余數為r(x)=0b0101 1001 1011 0101=0x59b5.輸出數據翻轉RefOut r(x)=0b1010 1101 1001 1010 =0xAD9A。
● 結果異或值XorOut為0xFFFF,CRC-16/DNP算法的CRC值= 結果異或值XorOut 按位異或 輸出數據翻轉RefOut r(x),即RefOut r(x) ^ XorOut 。其值為0xAD9A ^ 0xFFFF = 0xE265。

傳統CRC算法

實際應用時,發送方和接收方按以下方式通信:
發送方和接收方在通信前,約定好一個預設除數P(X)。P(X)首位和最后一位的系數必須為1. 以上面的CRC-8為例,多項式(poly)為X8 + X2 + X +1,對應除數P(X) = 10011.
發送方在發送前,將原始數據左移 除數P(X)的次冪的位,將其值進行模二除法運算生成余數F(X)(即CRC碼),然后將其附加到原始數據后面一起T(X)發送給接收方。
接收方收到后將其T(X)模二除以約定好的除數P(X),當且僅當余數為0時接收方認為沒有差錯.

CRC校驗碼的編碼方法是用待發送的二進制數據D(x)昧以生成多項式G(x),將最后的余數作為CRC校
驗碼。其實現步驟如下:
①沒待發送的數據塊是P位的二進制多項式D(x).生成多項式為i階的G(x)。在數據塊的末尾掭加i
個0.數據塊的長度增加到m+i位.對應的二進制多項式為xiD(x).
②用生成多項式G(x)去除xiD(x),求得余數為階數為i-1的二進制多項式R(x)。此二進制多項式R(x)
就是D(x)經過生成多項式G(x)編碼的CRC校驗碼。
③用xiD(x)以模2的方式減去R(x),得到二進制多項式xiD’(x)。xiD’(x)就是包含了CRC校驗碼的
待發送字符串。

基于查表法的CRC算法

計算機操作單元一般為字節為單位,所以采用一個或者多個字節長度的CRC進行校驗傳遞數據,提高CRC校驗速度。 預先將CRC計算出來,并存到校驗表里,且校驗表存在 該行的首個CRC碼與該列的首個CRC碼的異或值 與他們交集的CRC碼相同,每次調用CRC算法采用查表法替代移位計算發放,可提升計算速度。
以8bit 一個字節長度的CRC為例,有256種情況,對應余數有0~255種,將256種余數分別計算出來,按照順序存放在一個包含256個入口地址的校驗表中,然后對輸入數據流采用查表來實現。

設置數據流為,在這里插入圖片描述
數學表達式為
在這里插入圖片描述

,其中⊕為異或運算符。生成多項式為G(x)17bit,則CRC碼為CRC16,數學表示式為

CRC校驗可以100%地檢測出所有奇數個隨機錯誤和長度小于或等于i(i為g(x)的階數)的突發錯誤。
所以CRC的生成多項式的階數越高,那么誤判的概率就越小。

參考鏈接

【科普向】誰都能看懂的CRC(循環冗余校驗)原理:https://blog.csdn.net/weixin_44256803/article/details/105805628
什么是CRC:https://info.support.huawei.com/info-finder/encyclopedia/zh/CRC.html
CRC校驗查表法原理及實現(CRC-16): https://blog.csdn.net/AgonyRR/article/details/107810982
CRC循環冗余校驗 查表算法的代碼實現:https://blog.csdn.net/weixin_44256803/article/details/111794445
CRC在線計算: http://www.ip33.com/crc.html
[1]馬群,王會燃.基于查表法的嵌入式系統CRC算法研究[J].軟件導刊,2014,13(10):51-52.

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

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

相關文章

客戶關系管理怎么做?這4個工具一定要會用!

在商海浮沉中,每一位企業家和銷售經理都深知,客戶是企業生存與發展的基石。但如何有效管理這些寶貴的資源,讓每一次互動都成為加深關系、促進成交的契機,卻是一門藝術加科學的結合體。今天,咱們就來聊聊客戶關系管理&a…

3SRB5016-ASEMI逆變箱專用3SRB5016

編輯:ll 3SRB5016-ASEMI逆變箱專用3SRB5016 型號:3SRB5016 品牌:ASEMI 封裝:SGBJ-5 批號:2024 現貨:50000 最大重復峰值反向電壓:1600V 最大正向平均整流電流(Vdss):50A 功…

CNN -1 神經網絡-概述

CNN -1 神經網絡-概述 一:芯片科技發展介紹了解1> 芯片科技發展趨勢2> 芯片使用領域3> 芯片介紹1. 神經網絡芯片2. 神經網絡處理單元NPU(Neural Processing Unit)二:神經網絡1> 什么是神經網絡2> 神經元3> 人工神經網絡三:卷積神經網絡(CNN)入門講解一…

【Spring】springSecurity使用

一、基本配置 1. 引入依賴 在Spring Boot項目中&#xff0c;使用Spring Security首先需要引入相應的依賴。在pom.xml中添加spring-boot-starter-security依賴&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>…

Kodcloud可道云安裝與一鍵發布上線實現遠程訪問詳細教程

文章目錄 1.前言2. Kodcloud網站搭建2.1. Kodcloud下載和安裝2.2 Kodcloud網頁測試 3. cpolar內網穿透的安裝和注冊4. 本地網頁發布4.1 Cpolar云端設置4.2 Cpolar本地設置 5. 公網訪問測試6.結語 1.前言 本文主要為大家介紹一款國人自研的在線Web文件管理器可道云&#xff0c;…

唐劉:當 SaaS 愛上 TiDB(一)- 行業挑戰與 TiDB 的應對之道

導讀 在 TiDB 8.1 發布后&#xff0c;TiDB 展現了強大的支持 SaaS 業務的能力&#xff0c;成為 SaaS 業務數據庫的優先選擇之一。 本文為“當 SaaS 愛上 TiDB”系列文章的第一篇&#xff0c;系列文章將從技術原理和真實用戶體驗兩個角度深入探討 TiDB 在 SaaS 業務中的表現&a…

qt gridlayout 應用舉例

Qt的GridLayout是一種非常有用的布局管理器&#xff0c;它允許你在一個網格中放置控件&#xff0c;這樣你就可以創建出結構清晰、布局整齊的用戶界面。下面是一個使用GridLayout的簡單例子&#xff0c;展示了如何在一個窗口中放置幾個按鈕。 #include <QApplication> …

太速科技-3U VPX飛騰處理器刀片計算機

3U VPX飛騰處理器刀片計算機 一 、產品概述 該產品是一款基于國產飛騰FT2000 4核或騰銳D2000 8核的高性能3U VPX刀片式計算機。產品提供了4個x4 PCIe 3.0總線接口&#xff0c;同時可配置為1個x16或2個x8 PCIe3.0接口&#xff0c;因此具有很強的擴展性&#xff0c;極大…

agents 分類

一、分類 自動agent、半自動agent、領域、自定義sop和支持人為干預的agent。 先潑個冷水&#xff0c;目前這些agent項目都是實驗品&#xff0c;發展還沒有做知識庫問答相關開源項目那么成熟&#xff0c; 二、全自動agent autoGPT、loopGPT、babyAGI 全自動agent就是人類不可…

sizeof()

一、題目 *struct T { char a; int *d; int b; int c:16; double e; }; T *p; 在64位系統以及64位編譯器下&#xff0c;以下描述正確的是 A: sizeof 24 B: sizeof(p) 24 C: sizeof(p->a) 1 D: sizeof(p->e) 4 二、解析 p是一個指針&#xff0c;指針在32位機器上是…

GEE數據集——全球Ookla 5G 基站地圖數據(Ookla 5G Map Data)

Ookla 5G Map Data Ookla 5G 地圖數據 Ookla 5G Map? 于 2019 年 5 月推出,旨在全面展示 5G 技術在全球的擴展情況。在推出之初,該地圖突出顯示了 17 個國家的 300 項部署,說明了這一變革性技術的初步推廣情況。隨著時間的推移,該地圖已大幅增長,現在包含了來自 142 個…

實例演示Kafka-Stream消息流式處理流程及原理

以下結合案例&#xff1a;統計消息中單詞出現次數&#xff0c;來測試并說明kafka消息流式處理的執行流程 Maven依賴 <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-streams</artifactId><exclusio…

Java中的LinkedList(鏈表)(如果想知道Java中有關LinkedList的知識點,那么只看這一篇就足夠了!)

前言&#xff1a;在Java編程語言中&#xff0c;Java集合框架提供了一組豐富的數據結構&#xff0c;以滿足各種應用需求。其中&#xff0c;LinkedList作為一種常用的數據結構&#xff0c;具有獨特的優勢和廣泛的應用場景。 ???這里是秋刀魚不做夢的BLOG ???想要了解更多內…

linux radix-tree 基數樹實現詳解

radix tree&#xff0c;又稱做基數樹&#xff0c;是一種適合于構建key(index)與value(item)相關聯的數據結構。內核中使用非常廣泛。本文主要聚焦linux內核基數樹的代碼實現,大量注釋過的代碼。 radix-tree組織結構如下: 1、數據結構 /** The bottom two bits of the slot de…

如何通過JSON-RPC向以太坊鏈發送簽名交易數據?

概述 在以太坊開發當中,通過web3.js、ethers.js等提供的API方法,都可以完成與以太坊的轉賬交易。那么如何通過以太坊JSON-RPC與以太坊進行交易呢? 在以太坊的JSON-RPC當中,有eth_sendRawTransaction這個方法,可以向以太坊網絡提交預簽名的交易廣播。 curl https://main…

IDEA阿里云OSS實現文件上傳·解決蒼穹外賣圖片回顯

簡單交代配置阿里云OSS的思路 1. 首先去阿里云開通一個OSS服務&#xff0c;配置好一個自己的Bucket 2. 在IDEA配置Bucket 3. 拷貝官網的OSS工具類代碼 package com.sky.utils;import com.aliyun.oss.ClientException; import com.aliyun.oss.OSS; import com.aliyun.oss.OSS…

同三維T80001編碼器(帶屏)系列視頻使用操作說明書:高清HDMI編碼器,高清SDI編碼器,4K超清HDMI編碼器,雙路4K超高清編碼器

同三維T80001編碼器&#xff08;帶屏&#xff09;系列視頻使用操作說明書&#xff1a;高清HDMI編碼器&#xff0c;高清SDI編碼器&#xff0c;4K超清HDMI編碼器&#xff0c;雙路4K超高清編碼器 同三維T80001編碼器&#xff08;帶屏&#xff09;系列視頻使用操作說明書&#xff1…

【C語言】printf、fprintf、sprintf,scanf、fscanf、sscanf的區別

目錄 前言 printf、fprintf、sprintf printf fprintf sprintf scanf、fscanf、sscanf scanf fscanf sscanf 前言 這幾個函數曾出現在面試中&#xff0c;因為函數名都差不多&#xff0c;所以很讓人迷惑啊~ 下面我們逐個分析。 printf、fprintf、sprintf 這三個函數的主…

子任務:IT運維的精細化管理之道

在當今的企業運營中&#xff0c;信息技術已成為支撐業務發展的核心力量。根據Gartner的報告&#xff0c;IT服務管理&#xff08;ITSM&#xff09;的有效實施可以顯著提升企業的運營效率&#xff0c;降低成本高達15%&#xff0c;同時提高服務交付速度和質量。隨著業務的復雜性和…

電腦工具箱神器——uTools

AI視頻生成&#xff1a;小說文案智能分鏡智能識別角色和場景批量Ai繪圖自動配音添加音樂一鍵合成視頻https://aitools.jurilu.com/ 很多人腦子里都有一些一個月只用兩三次的軟件&#xff0c;這些軟件就這樣積滿了灰塵&#xff0c;需要的時候又不知道去哪里找。uTools 完美地解決…