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...