CRC32 迴圈冗餘校驗 演算法的簡單介紹

2021-10-06 10:11:38 字數 2366 閱讀 9091

crc校驗實用程式庫 在資料儲存和資料通訊領域,為了保證資料的正確,就不得不採用檢錯的手段。在諸多檢錯手段中,crc是最著名的一種。crc的全稱是迴圈冗餘校驗,其特點是:檢錯能力極強,開銷小,易於用編碼器及檢測電路實現。從其檢錯能力來看,它所不能發現的錯誤的機率僅為0.0047%以下。從效能上和開銷上考慮,均遠遠優於奇偶校驗及算術和校驗等方式。因而,在資料儲存和資料通訊領域,crc無處不在:著名的通訊協議x.25的fcs(幀檢錯序列)採用的是crc-ccitt,arj、lha等壓縮工具軟體採用的是crc32,磁碟驅動器的讀寫採用了crc16,通用的影象儲存格式gif、tiff等也都用crc作為檢錯手段。 

crc的本質是模-2除法的餘數,採用的除數不同,crc的型別也就不一樣。通常,crc的除數用生成多項式來表示。最常用的crc碼的生成多項式如表1所示。 

@@10a08800.gif;表1.最常用的crc碼及生成多項式@@ 

由於crc在通訊和資料處理軟體中經常採用,筆者在實際工作中對其演算法進行了研究和比較,總結並編寫了乙個具有最高效率的crc通用程式庫。該程式採用查表法計算crc,在速度上優於一般的直接模仿硬體的演算法,可以應用於通訊和資料壓縮程式。 

通常的crc演算法在計算乙個資料段的crc值時,其crc值是由求解每個數值的crc值的和對crc暫存器的值反覆更新而得到的。這樣,求解crc的速度較慢。通過對crc演算法的研究,我們發現:乙個8位資料加到16位累加器中去,只有累加器的高8位或低8位與資料相作用,其結果僅有256種可能的組合值。因而,我們可以用查表法來代替反覆的運算,這也同樣適用於crc32的計算。本文所提供的程式庫中,函式crchware是一般的16位crc的演算法;mk-crctbl用以在記憶體中建立乙個crc數值表;crcupdate用以查表並更新crc累加器的值;crcrevhware和crcrevupdate是反序演算法的兩個函式;buildcrctable、calculateblockcrc32和updatecharac 

tercrc32用於crc32的計算。 

/* crc.c——crc程式庫 */ 

#define crcccitt 0x1021 

#define ccitt-rev 0x8408 

#define crc16 0x8005 

#define crc16-rev 0xa001 

#define crc32-polynomial 0xedb88320l 

/* 以上為crc除數的定義 */ 

#define nil 0 

#define crcupdate(d,a,t)*(a)=(*(a)<<8)^(t)[(*(a)>>8)^(d)]; 

#define crcupdate16(d,a,t)*(a)=(*(a)>>8^(t)[(*(a)^(d))&0x00ff]) 

/* 以上兩個巨集可以代替函式crcupdate和crcrevupdate */ 

#include

#include

#include

/* 函式crchware是傳統的crc演算法,其返回值即crc值 */ 

unsigned short crchware(data,genpoly,accum) 

unsigned short data;/* 輸入的資料 */ 

unsigned short genpoly;/* crc除數 */ 

unsigned short accum;/* crc累加器值 */ 

return (accum); 

} /* 函式mk-crctbl利用函式crchware建立記憶體中的crc數值表 */ 

unsigned short *mk-crctbl(poly,crcfn); 

unsigned short poly;/* crc除數--crc生成多項式 */ 

r>unsigned short (*crcfn)();/* 指向crc函式(例如crchware)的指標 */ 

/* 函式mk-crctbl的使用範例 */ 

if((crctblp=mk-crctbl(crcccitt,crchware))==nil) 

/* 函式crcrevhware是傳統的crc演算法的反序演算法,其返回值即crc值 */ 

unsigned short crcrevhware(data,genpoly,accum) 

unsigned short data; 

unsigned short genpoly; 

unsigned short accum; 

return accum; 

} /* 函式crcrevupdate用以用反序查表法計算crc值並更新crc累加器值 */ 

void crcrevupdate(data,accum,crcrevtab) 

unsigned short data; 

unsigned short *accum;dvnews

CRC冗餘校驗演算法 MTU

crc原理 先選擇乙個用於在接收端進行校驗時,對接收的貞進行除法運算的除數 看所選定的除數的二進位制位數 假定為k位 然後要在要求傳送的資料幀後面加上k 1位0,然後這個加了k 1位0的新幀中,以模2除法的方式,除以上面這個除數,所得到的係數就是該幀的crc校驗碼。把這個校驗碼附在源資料幀的後面 不...

迴圈冗餘校驗 CRC32 的 C 語言實現

crc即迴圈冗餘校驗碼 cyclic redundancy check 是資料通訊領域中最常用的一種差錯校驗碼,其特徵是資訊字段和校驗欄位的長度可以任意選定。crc校驗實用程式庫在資料儲存和資料通訊領域,為了保證資料的正確,就不得不採用檢錯的手段。下面是crc32的c語言實現,經過測試,能夠正確執行...

迴圈冗餘校驗CRC演算法

本文參考自 crc校驗 迴圈冗餘校驗 是資料通訊中最常採用的校驗方式。在嵌入式軟體開發中,經常要用到crc 演算法對各種資料進行校驗。因此,掌握基本的crc演算法應是嵌入式程式設計師的基本技能。其實,在網上有一篇介紹crc 演算法的非常好的文章,作者是ross williams,題目叫 a pain...