1. 程式人生 > >CRC校驗詳解及其在網路程式設計中的應用

CRC校驗詳解及其在網路程式設計中的應用

基本概念

CRC(Cyclic Redundancy Check,迴圈冗餘校驗),其實是個很古老的資料校驗方法了,記得以前大學<<微機原理>>和<<微機原理與介面技術>>課程都對其進行了介紹,其校驗準確度較之普通的奇偶校驗、校驗和等方法更高,當然計算也略微複雜;較之MD5、SHA1等演算法,CRC安全性和準確度方面又略顯不足,但計算較之這兩者明顯簡單,效率更高。所以如果僅僅針對網路資料的一致性校驗,即收發端資料的是否一致(因為在Socket程式設計裡,單次收到資料的長度和傳送資料的長度即使在阻塞模式下,也不一定是相同的,這個依賴於網路環境,雖然TCP協議保證了資料的完整性和一致性,但像這種人為對資料進行了分片的情況,在收到資料時視情況還是有必要進行一下校驗),針對這種校驗要求,CRC32是明顯足夠,也不會帶來很大的計算負擔。

CRC32的C語言實現

關於CRC32(即校驗碼是32位)實現理論原理,這裡不多說,網上有大把的資料,這裡主要探究一下怎樣用C語言高效的實現CRC32校驗演算法。
下面的演算法用到了查詢表的方法,這也是比較常見的以空間換時間的思想。
對於以按位元組校驗的CRC演算法實現中,一個位元組8bit,取值範圍0~255,每個位元組均是如此。因此可以生成一個0~255所有數的校驗結果的陣列,以後就是取這個陣列的值就可以了。
查詢表實現程式碼:

int init_crc32_table(uint32_t crc32_table[])
{
    uint32_t c;
    int i = 0
; int bit = 0; for (i = 0; i < 256; i++) { c = (uint32_t)i; for (bit = 0; bit < 8; bit++) { if (c & 1) { c = (c >> 1) ^ (0xEDB88320)//此十六進位制數代表CRC32標準多項式; } else { c = c >> 1; } } crc32_table[i] = c; } return
0; }

資料校驗程式碼:
uint32_t crc傳入的初始值為0xffffffff;

uint32_t make_crc(uint32_t crc, unsigned char *string, uint32_t size, uint32_t crc32_table[])
{

    while (size--)
        crc = (crc >> 8) ^ (crc32_table[(crc ^ *string++) & 0xff]);

    return crc;
}

後記

上面程式碼測試過,可以直接用,可以看出,CRC32的實現還是比較容易的,計算效率也不錯,如果不是對一致性檢測要求過高的話,可以考慮CRC32以及同系的CRC16、CRC8等演算法。

相關推薦

CRC及其網路程式設計應用

基本概念 CRC(Cyclic Redundancy Check,迴圈冗餘校驗),其實是個很古老的資料校驗方法了,記得以前大學<<微機原理>>和<<微機原理與介面技術>>課程都對其進行了介紹,其校驗準確度

crc

一、crc校驗是什麼?   CRC即迴圈冗餘校驗碼(Cyclic Redundancy Check[1] ):是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊欄位和校驗欄位的長度可以任意選定。迴圈冗餘檢查(CRC)是一種資料傳輸檢錯功能,對資料進行多項式

iOS應用內支付(IAP)服務端端

imageview sof 客戶端 標識 知識庫 ndb json replace undle IAP流程 IAP流程分為兩種: 一種是直接使用Apple的服務器進行購買和驗證, 另一種就是自己假設服務器進行驗證。由於國內網絡連接Apple服務器驗證非常慢,而且也為了防止黑

圖文網路程式設計

1.網路程式設計 什麼是網路程式設計 多臺計算機連線形成網路 網路的作用 資料互動 資料共享 2.網路三要素 網路協議:雙方實體完成通訊或服務所必須遵循的規則和約定  &

C# 網路程式設計系列:實現類似QQ的即時通訊程式

https://www.jb51.net/article/101289.htm   引言: 前面專題中介紹了UDP、TCP和P2P程式設計,並且通過一些小的示例來讓大家更好的理解它們的工作原理以及怎樣.Net類庫去實現它們的。為了讓大家更好的理解我們平常中常見的軟體QQ的工作原理,所以在本專題

Java資料

一切從超程式設計開始 一個健壯的系統都要對外部提交的資料進行完整性、合法性的校驗。即使開發一個不面對終端使用者的工具包,也需要對傳入的資料進行縝密的校驗來防止引發底層難以追蹤的問題。各路大神當然也會注意到這個問題,所以在“超程式設計”(見JSR250與資源控制)提出之後

Bresenham畫線演算法及其OpenGL程式設計實現

Bresenham是由Bresenham提出的一種精確而有效地光柵線生成演算法,該演算法僅使用增量整數計算。另外,它還可以用於顯示其它曲線。 我們以斜率大於0小於1的線段來進行考慮。以單位x間隔進行取樣。每次繪製了當前畫素點(xk,yk)之後,需要確定下一個要

SSH-key及其在Git的使用

有必要先來了解什麼是SSH和什麼是SSH key。 SSH Secure Shell (SSH) 是一個允許兩臺電腦之間通過安全的連線進行資料交換的網路協議。通過加密保證了資料的保密性和完整性。SSH採用公鑰加密技術來驗證遠端主機,以及(必要時)允許遠端主機驗證使用者。 傳統的FTP、Telnet是再網

設計模式 - 模板方法模式及其在Spring應用

基本介紹 模板方法模式(Template Method Pattern)也叫模板模式,它在一個抽象類中公開定義了執行它的方法的模板,它的字類可以按需重寫方法實現,但呼叫將以抽象類中定義的方式進行。 簡單來說,模板方法模式定義一個操作中的演算法的骨架,將一些步驟延遲到子類中,使得子類可以不改變一個演算法的結構,

設計模式 - 命令模式及其在JdbcTemplate應用

# 基本介紹 > 在軟體設計中,我們經常需要向某些物件傳送一些請求,但是並不知道請求的接收者是誰,也不知道被請求的操作是哪個,我們只需要在程式執行時指定具體的請求接收者即可,此時,可以使用命令模式來設計,使得請求傳送者與請求接收者消除彼此之間的耦合,讓物件之間的呼叫關係更加靈活。 命令模式(Command

談談網路程式設計應用層(基於TCP/UDP)的協議設計

 對於初涉網路程式設計的開發人員來說,在通訊協議的設計上一般會有所困惑。一般的網路程式設計書籍上也較少涉及這方面的內容。估計是覺得太簡單了。這塊確實是不難,但如果不瞭解,又很容易出簍子或者繞彎路。下面我就來談談基於TCP/UDP的協議設計。     1、基於TCP的協議

LSTM網路及其應用例項

上一節我們介紹了RNN網路層的記憶性原理,同時使用了keras框架聽過的SimpleRNN網路層到實際運用中。然而使用的效果並不理想,主要是因為simpleRNN無法應對過長單詞串的輸入,在理論上,當它接收第t個輸入時,它應該能把前面好幾個單詞的處理資訊記錄下來,但實際上它無法把前面已經

網路CRC

基本概念 CRC即迴圈冗餘校驗碼,是資料通訊領域中最常用的一種查錯校驗碼,其特徵是資訊欄位和校驗欄位的長度可以任意選定。 迴圈冗餘檢查(CRC)是一種資料傳輸檢錯功能,對資料進行多項式計算,並將得到的

關於CRC演算法及其C程式碼實現

以CRC16作為參考: CRC16常見的標準有以下幾種,被用在各個規範中,其演算法原理基本一致,就是在資料的輸入和輸出有所差異,下邊把這些標準的差異列出,並給出C語言的演算法實現。 CRC16_

斯坦福大學(吳恩達) 機器學習課後習題 第四周 程式設計題 多分類和神經網路

作業下載地址:https://download.csdn.net/download/wwangfabei1989/103008901. 邏輯迴歸代價函式 lrCostFuctionfunction [J, grad] = lrCostFunction(theta, X, y,

Storm概念、原理及其應用(一)BaseStorm

when 結構 tails 並發數 vm 虛擬機 cif 異步 優勢 name 本文借鑒官文,添加了一些解釋和看法,其中有些理解,寫的比較粗糙,有問題的地方希望大家指出。寫這篇文章,是想把一些官文和資料中基礎、重點拿出來,能總結出便於大家理解的話語。與大多數“wordc

算法筆記--sg函數及其模板

clas ref http spa for tail details false art sg函數大神詳解:http://blog.csdn.net/luomingjun12315/article/details/45555495 模板: int f[N],SG[N];

Maven及其環境配置

下使用 .html tor update baidu load set mode dex Maven詳解 一.前言 以前做過的項目中,沒有真正的使用過Maven,只知道其名聲很大,其作用是用來管理jar 包的。最近一段時間在項目過程中使用Maven,用Mav

AIX下PVID及其修改方法

AIX下PVID詳解及其修改方法AIX 下 PVID 詳解及其修改方法1.PVID 是什麽PVID 全稱 physical volume identifier,它非常重要,相當於軟序列號,當把一個磁盤變成 PV 時, 就生成了 PVID , PVID 是由機器序列號 (uname -m的前8位 ) 和它生成的

JavaList,Set和Map及其區別

內部 特殊 set contain 快速查找 簡單 rar dset 維護 Java中的集合包括三大類,它們是Set(集)、List(列表)和Map(映射),它們都處於java.util包中,Set、List和Map都是接口,它們有各自的實現類。Set的實現類主要有Hash