crc16是什么算法

核心概念

?CRC16? 是一種循環冗余校驗算法,屬于哈希函數的一種。它的核心目的是檢測數據的錯誤,通常用于數字網絡和存儲設備中,來驗證數據在傳輸或存儲后是否依然完整、無誤。

你可以把它想象成一個數據的“指紋”或“摘要”。發送方計算出一段數據的 CRC16 值并隨數據一起發送,接收方在收到數據后同樣計算 CRC16 值。如果兩個值相同,則認為數據在傳輸過程中極大概率沒有出錯;如果不同,則肯定發生了錯誤,數據需要重傳。

算法原理(通俗版)

CRC16 的計算過程可以類比于一種特殊的“除法”,但不是在數字上做除法,而是在二進制位上做。

  1. ?選定一個除數?:這個除數是一個固定的、預先定義好的二進制數,稱為 ??“生成多項式”?。不同的多項式會產生不同的CRC校驗結果,從而形成了不同的CRC16標準(如CRC-16-CCITT、CRC-16-MODBUS等)。這個除數通常被稱為 ??“Poly”?

    • 例如,一個常用的多項式是 0x1021(十六進制表示),其二進制為 1 0000 0010 0001(共17位)。

  2. ?準備被除數?:在原始數據的末尾添加一串 0(零),添加的 0的數量等于 CRC 值的長度(CRC16就是16位,所以添加16個0)。這個新組成的數就是“被除數”。

  3. ?執行“除法”??:

    • 將“被除數”與“生成多項式”對齊。

    • 進行 ??“模2除法”??(也叫“異或除法”)。這種除法的特點是:它不看商是多少,只看余數;并且每一步的減法操作不借位,實際上就是進行異或(XOR)運算

    • 用生成多項式(除數)對數據的前幾位進行異或操作,得到一個結果,然后向右“滑動”一位,繼續處理后續的數據位。

  4. ?得到余數?:經過整個“除法”過程后,最終得到的余數就是 ?CRC16 校驗值。這個余數的長度肯定會小于除數的長度(即16位),所以它是一個16位的值,通常用4個十六進制數字表示(如 0xC3A7)。

?關鍵點?:這個計算過程可以通過硬件電路(由移位寄存器和異或門組成)高效實現,也可以通過軟件查表法來極大提升速度,因此非常適合在通信協議中快速使用。


主要特點

  • ?檢測錯誤能力?:CRC16 能有效檢測出:

    • 所有單比特錯誤。

    • 所有的雙比特錯誤(只要多項式選擇得當)。

    • 任何奇數位的錯誤。

    • 大多數突發性錯誤(連續多位錯誤)。

  • ?非加密?:CRC是校驗碼,不是加密哈希?(如MD5, SHA)。它的目的是檢測無意的、隨機的錯誤,而不是防止有意的篡改。它非常容易反向計算和偽造。

  • ?輸出長度固定?:無論輸入數據多長,輸出永遠是16位(2字節)。

  • ?計算速度快?:硬件和優化的軟件實現都非常高效。


常見的 CRC16 標準

“CRC16”是一個統稱,具體使用哪種取決于生成多項式、初始值、輸入輸出是否反轉等參數。最常見的幾種是:

  1. ?CRC-16-CCITT (XMODEM)??

    • 多項式: 0x1021(正常形式)

    • 初始值: 0x0000

    • 常用于XMODEM協議、藍牙、PC串口等。

  2. ?CRC-16-CCITT (KERMIT) / CRC-16-MODBUS?

    • 多項式: 0x1021

    • ?注意?:Kermit和MODBUS版本在初始值和反轉規則上與XMODEM不同。MODBUS是工業領域極其常見的標準。

    • MODBUS參數:初始值 0xFFFF,輸入輸出都反轉。

  3. ?CRC-16-USB?

    • 多項式: 0x8005(另一種常見形式)

    • 初始值: 0xFFFF

    • 用于USB數據包校驗。

?重要提示?:正因為參數不同,在開發時必須明確約定使用哪一種CRC16變體,否則通信雙方計算出的校驗碼會不一致,導致通信失敗。


簡單示例

假設我們有一個簡單的數據 0x01, 0x02,使用最簡單的參數(初始值0)計算。

  1. 數據二進制: 00000001 00000010

  2. 后面加16個0: 00000001 00000010 00000000 00000000

  3. 用多項式 0x1021(二進制: 0001000000100001) 對這個長長的數進行模2除法。

  4. 最終會得到一個16位的余數,比如(假設的)0xE2F1

這個 0xE2F1就是CRC16校驗碼,它會跟隨數據 0x01, 0x02一起被發送出去。

總結

?CRC16? 是一種高效、可靠的錯誤檢測算法,通過一種特殊的二進制除法得到數據的16位“指紋”。它廣泛應用于網絡通信(如MODBUS)、數據存儲(如ZIP文件)等場景,以確保數據的完整性。在使用時,最關鍵的是要確保通信雙方采用完全相同的CRC16標準參數。

你可以使用在線的CRC計算器或編程語言中的相關庫(如Python的crcmod、C#的System.IO.Hashing.Crc32等)來輕松計算它。

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

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

相關文章

Day8--HOT100--160. 相交鏈表,206. 反轉鏈表,234. 回文鏈表,876. 鏈表的中間結點

Day8–HOT100–160. 相交鏈表,206. 反轉鏈表,234. 回文鏈表,876. 鏈表的中間結點 每日刷題系列。今天的題目是力扣HOT100題單。 鏈表題目。 160. 相交鏈表 思路【我】: 1,計算鏈表長度 2,令A為較短鏈&am…

Rust面試題及詳細答案120道(58-65)-- 集合類型

《前后端面試題》專欄集合了前后端各個知識模塊的面試題,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs&…

Horse3D游戲引擎研發筆記(八):在QtOpenGL環境下,按需加載彩虹四邊形的頂點屬性 (Unity、Unreal Engine、Three.js與Godot)

在上一篇博客中,我們探討了如何在QtOpenGL環境下使用改進的Uniform變量管理方式繪制多彩四邊形。本文將延續這一主題,深入探討如何在QtOpenGL環境下按需加載彩虹四邊形的頂點屬性。這一功能是Horse3D引擎渲染系統的重要組成部分,旨在實現靈活…

模塊化設計+微米級精度,GelSight Modulus 觸覺型3D輪廓儀深入檢測“盲區”

當航空航天工程師在精密艙體中搜尋微米級缺陷,汽車檢查員在車間復雜結構里排查隱患,能源領域創新者嘗試突破檢測邊界時,深耕視觸覺 3D 顯微技術的企業——GelSight,正以全新研發的GelSight Modulus觸覺型3D輪廓儀(簡稱…

Pytorch安裝詳細步驟

第一步:檢查顯卡支持的的CUDA版本 1.打開NVIDIA控制面板 首先鼠標右擊桌面-顯示更多選項-NVIDIA控制面板-點擊彈出界面右上角的(系統信息)-點擊彈出界面的(組件) 2.查看驅動版本 打開系統信息 點擊組件,查看 以觀測到紅色方框內的信息可以看到(NVIDIA CUDA 13.0.…

2025職場進階:低門檻技能實用手冊

每到年初,都會有人問:如果只能投入有限的時間與預算,先考哪一兩本證書更劃算?本文把近兩年的崗位需求、學習可獲得性與花費周期做了綜合權衡,給出一個以“先提升通用能力,再疊加行業資質”為主線的組合方案…

SDC命令詳解:使用set_timing_derate命令進行約束

相關閱讀 SDC命令詳解https://blog.csdn.net/weixin_45791458/category_12931432.html?spm1001.2014.3001.5482 目錄 指定降額比例 指定降額對象列表/集合 指定沿 指定最大、最小條件 指定早、晚條件 指定路徑的類型 指定降額類型 指定約束 指定增量 寫在最后 由于制造…

C++語言程序設計——03 進制ASCII碼

目錄一、進制表示與轉換(一)不同進制表示(二)進制轉換方法二、ASCII 碼(一)ASCII 碼表(二)ASCII 碼轉換(三)大小寫英文字母轉換【總結:如何記憶AS…

AtCoder Beginner Contest 420-Toggle Maze

題目描述 有一個 H行 W 列的網格。用 (i,j) 表示位于第 i 行(從上往下數)第 j 列(從左往右數)的格子。每個格子的狀態用字符 Ai,j表示,含義如下: . :空格子。 #’ :障礙格子。 S &am…

20、DMA----釋放CPU壓力,加快傳輸

1、DMA介紹DMA,全稱為:Direct Memory Access,即直接存儲器訪問。DMA傳輸方式無需CPU直接控制傳輸,也沒有中斷處理方式那樣保留現場和恢復現場的過程,通過硬件為RAM與I/O設備開辟一條直接傳送數據的通路,能使…

深入OpenHarmony OTA硬核升級

技術背景 OpenHarmony OTA(Over-The-Air)升級子系統為設備提供了遠程升級能力,通過統一的升級接口屏蔽底層芯片差異,支持輕量系統、小型系統和標準系統的全量升級、差分升級和變分區升級。 核心特性 跨系統支持:覆蓋輕量系統(Hi3861)、小型系統(Hi3516DV300)、標準系…

華為iVS1800接入SVMSPro平臺

華為iVS1800接入SVMSPro平臺 ** 華為好望Huawei HolosensIVS1800智能視頻云平臺采用首款昇騰310加持的嵌入式系統智能微邊緣,獨俱普惠AI鴻力。一臺融合存儲、計算、檢索功能,滿足小型園區、社區、銀行網點、超市等場景安防需求,小機大智。 …

《異形戰機2》v2.0.4數字豪華版,3D橫版射擊再臨,機體武器海量升級

[游戲名稱]: 《異形戰機2》v2.0.4數字豪華版 [軟件大小]: 17.7 GB [軟件大小]: 夸克網盤 | 百度網盤 游戲介紹 《異形戰機:最終版2》續作震撼登場!經典橫版射擊全面升級:3D 畫面炫目、關卡與機體海量擴充,只為帶來酣暢淋漓的滅…

Java 異常(Throwable)

1. Throwable Throwable: 所有異常和錯誤的根類。實現 Throwable 或其子類的對象才能被 throw 或 catch。 Error: 表示嚴重的系統級問題,通常不應該被捕獲或處理,程序通常無法從中恢復。 Exception: 表示程序可以處理的問題。分為 運行時異常、 受檢異常…

rocketmq常用命令

官方文檔 https://rocketmq.apache.org/zh/docs/ https://rocketmq.apache.org/zh/docs/domainModel/02topic/ https://rocketmq.apache.org/zh/docs/4.x/deployment/02admintool 集群配置管理 https://mp.weixin.qq.com/s/688wNSwZPraGvAnr0K7hRw RocketMQ運維管理命令mqadm…

【C++詳解】哈希表概念與實現 開放定址法和鏈地址法、處理哈希沖突、哈希函數介紹

文章目錄一、unordered系列的使用unordered_set類的介紹unordered_set和set的使?差異unordered_map和map的使?差異unordered_xxx的哈希相關接?二、哈希表實現哈希概念直接定址法哈希沖突負載因?將關鍵字轉為整數哈希函數除法散列法/除留余數法乘法散列法處理哈希沖突開放定…

電影感人文街拍擺攤紀實攝影后期Lr調色教程,手機濾鏡PS+Lightroom預設下載!

調色介紹電影感人文街拍擺攤紀實攝影后期 Lr 調色是一種專注于捕捉街頭生活煙火氣的攝影風格,通過 Lightroom 后期調色賦予畫面電影般的敘事感和情感深度。這種風格以擺攤小販、市井行人、街頭場景為主體,強調真實、自然的生活瞬間。調色核心在于低飽和暖…

【數據分享】298個地級市人工智能企業數量(1990-2023)

數據介紹引言人工智能產業作為數字經濟的核心驅動力,其發展規模與分布格局深刻反映區域科技創新活力與產業升級潛力。為助力相關研究,本文分享一份涵蓋全國 298 個地級市 1990-2023 年的人工智能企業核心數據,包含人工智能企業存量和人工智能…

LeetCode 面試經典 150_雙指針_驗證回文串(25_125_C++_簡單)(雙指針)

LeetCode 面試經典 150_數組/字符串_驗證回文串(25_125_C_簡單)題目描述:輸入輸出樣例:題解:解題思路:思路一(雙指針):代碼實現代碼實現(思路一(雙…

無障礙輔助模塊|Highcharts引領可訪問數據可視化的交流

在現代數據可視化中,無障礙輔助技術已成為必不可少的一部分。對于視障人士或使用屏幕閱讀器的用戶來說,傳統圖表往往難以獲取有效信息,而 Highcharts 在設計之初便充分考慮了無障礙體驗。 Highcharts作為可訪問數據可視化的倡導者&#xff0…