為了提高編碼效率,在實(shí)際運(yùn)用中大多采用查表法來完成CRC-32校驗(yàn),下面是產(chǎn)生CRC-32校驗(yàn)嗎的子程序。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括孝感網(wǎng)站建設(shè)、孝感網(wǎng)站制作、孝感網(wǎng)頁制作以及孝感網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,孝感網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到孝感省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
unsigned long crc_32_tab[256]={
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,0x0edb8832,…, 0x5a05df1b, 0x2d02ef8d
};//事先計(jì)算出的參數(shù)表,共有256項(xiàng),未全部列出。
unsigned long GenerateCRC32(char xdata * DataBuf,unsigned long len)
{
unsigned long oldcrc32;
unsigned long crc32;
unsigned long oldcrc;
unsigned int charcnt;
char c,t;
oldcrc32 = 0x00000000; //初值為0
charcnt=0;
while (len--) {
t= (oldcrc32 24) 0xFF; //要移出的字節(jié)的值
oldcrc=crc_32_tab[t]; //根據(jù)移出的字節(jié)的值查表
c=DataBuf[charcnt]; //新移進(jìn)來的字節(jié)值
oldcrc32= (oldcrc32 8) | c; //將新移進(jìn)來的字節(jié)值添在寄存器末字節(jié)中
oldcrc32=oldcrc32^oldcrc; //將寄存器與查出的值進(jìn)行xor運(yùn)算
charcnt++;
}
crc32=oldcrc32;
return crc32;
}
參數(shù)表可以先在PC機(jī)上算出來,也可在程序初始化時完成。下面是用于計(jì)算參數(shù)表的c語言子程序,在Visual C++ 6.0下編譯通過。
#include stdio.h
unsigned long int crc32_table[256];
unsigned long int ulPolynomial = 0x04c11db7;
unsigned long int Reflect(unsigned long int ref, char ch)
{ unsigned long int value(0);
// 交換bit0和bit7,bit1和bit6,類推
for(int i = 1; i (ch + 1); i++)
{ if(ref 1)
value |= 1 (ch - i);
ref = 1; }
return value;
}
init_crc32_table()
{ unsigned long int crc,temp;
// 256個值
for(int i = 0; i = 0xFF; i++)
{ temp=Reflect(i, 8);
crc32_table[i]= temp 24;
for (int j = 0; j 8; j++){
unsigned long int t1,t2;
unsigned long int flag=crc32_table[i]0x80000000;
t1=(crc32_table[i] 1);
if(flag==0)
t2=0;
else
t2=ulPolynomial;
crc32_table[i] =t1^t2 ; }
crc=crc32_table[i];
crc32_table[i] = Reflect(crc32_table[i], 32);
}
}
通常的CRC算法在計(jì)算一個數(shù)據(jù)段的CRC值時,其CRC值是由求解每個數(shù)值的CRC值的和對CRC寄存器的值反復(fù)更新而得到的。這樣,求解CRC的速度較慢。通過對CRC算法的研究,我們發(fā)現(xiàn):一個8位數(shù)據(jù)加到16位累加器中去,只有累加器的高8位或低8位與數(shù)據(jù)相作用,其結(jié)果僅有256種可能的組合值。因而,我們可以用查表法來代替反復(fù)的運(yùn)算,這也同樣適用于CRC32的計(jì)算。本文所提供的程序庫中,函數(shù)crchware是一般的16位CRC的算法;mk-crctbl用以在內(nèi)存中建立一個CRC數(shù)值表;crcupdate用以查表并更新CRC累加器的值;crcrevhware和crcrevupdate是反序算法的兩個函數(shù);BuildCRCTable、CalculateBlockCRC32和UpdateCharac
terCRC32用于CRC32的計(jì)算。 /*CRC.C——CRC程序庫*/#define?CRCCCITT0x1021#define?CCITT-REV0x8408#define?CRC160x8005#define?CRC16-REV0xA001#define?CRC32-POLYNOMIAL0xEDB88320L/*以上為CRC除數(shù)的定義*/#define?NIL0#define?crcupdate(d,a,t)???*(a)=(*(a)8)^(t)[(*(a)8)^(d)];#define?crcupdate16(d,a,t)?*(a)=(*(a)8^(t)[(*(a)^(d))0x00ff])/*以上兩個宏可以代替函數(shù)crcupdate和crcrevupdate*/#include?stdio.h#include?stdlib.h#include?alloc.h/*函數(shù)crchware是傳統(tǒng)的CRC算法,其返回值即CRC值*/unsigned?short?crchware(data,genpoly,accum)unsigned?short?data;/*輸入的數(shù)據(jù)*/unsigned?short?genpoly;/*CRC除數(shù)*/unsigned?short?accum;/*CRC累加器值*/{????static?int?i;????data=8;????for(i=8;i0;i--)????{????????if((data^accum)0x8000)????????accum=(accum1)^genpoly;????????else????????accum=1;????????data=1;????}????return(accum);}/*函數(shù)mk-crctbl利用函數(shù)crchware建立內(nèi)存中的CRC數(shù)值表*/unsigned?short?*mk-crctbl(poly,crcfn);unsigned?short?poly;????????/*CRC除數(shù)--CRC生成多項(xiàng)式*/Runsigned?short(*crcfn)();??/*指向CRC函數(shù)(例如crchware)的指針*/{????/*unsignedshort*/malloc();*/????unsignedshort*crctp;????inti;????if((crctp=(unsignedshort*)malloc(256*sizeof(unsigned)))==0)????return0;????for(i=0;i256;i++)????crctp=(*crcfn)(i,poly,0);????returncrctp;}/*函數(shù)mk-crctbl的使用范例*/if((crctblp=mk-crctbl(CRCCCITT,crchware))==NIL){????puts(insuffmemoryforCRClookuptable.n);????return1;*/????/*函數(shù)crcupdate用以用查表法計(jì)算CRC值并更新CRC累加器值*/????voidcrcupdate(data,accum,crctab)????unsignedshortdata;/*輸入的數(shù)據(jù)*/????unsignedshort*accum;/*指向CRC累加器的指針*/????unsignedshort*crctab;/*指向內(nèi)存中CRC表的指針*/????{????????staticshortcomb-val;????????comb-val=(*accum8)^data;????????*accum=(*accum8)^crctab[comb-val];????}????/*函數(shù)crcrevhware是傳統(tǒng)的CRC算法的反序算法,其返回值即CRC值*/????unsignedshortcrcrevhware(data,genpoly,accum)????unsignedshortdata;????unsignedshortgenpoly;????unsignedshortaccum;????{????????staticinti;????????data=1;????????for(i=8;i0;i--)????????{????????????data=1;????????????if((data^accum)0x0001)????????????accum=(accum1)^genpoly;????????????else????????????accum=1;????????}????????returnaccum;????}????/*函數(shù)crcrevupdate用以用反序查表法計(jì)算CRC值并更新CRC累加器值*/????voidcrcrevupdate(data,accum,crcrevtab)????unsignedshortdata;????unsignedshort*accum;DvNews2.
crc32 — 計(jì)算一個字符串的 crc32 多項(xiàng)式
CRC的本質(zhì)是模-2除法的余數(shù),采用的除數(shù)不同,CRC的類型也就不一樣。通常,CRC的除數(shù)用生成多項(xiàng)式來表示。 最常用的CRC碼及生成多項(xiàng)式名稱生成多項(xiàng)式。
CRC-12:
CRC-16:
CRC-CCITT:
CRC-32:
CRC校驗(yàn)實(shí)用程序庫 在數(shù)據(jù)存儲和數(shù)據(jù)通訊領(lǐng)域,為了保證數(shù)據(jù)的正確,就不得不采用檢錯的手段。在諸多檢錯手段中,CRC是最著名的一種。CRC的全稱是循環(huán)冗余校驗(yàn)。
擴(kuò)展資料
通常的CRC算法在計(jì)算一個數(shù)據(jù)段的CRC值時,其CRC值是由求解每個數(shù)值的CRC值的和對CRC寄存器的值反復(fù)更新而得到的。這樣,求解CRC的速度較慢。通過對CRC算法的研究,我們發(fā)現(xiàn):一個8位數(shù)據(jù)加到16位累加器中去,只有累加器的高8位或低8位與數(shù)據(jù)相作用,其結(jié)果僅有256種可能的組合值。
因而,我們可以用查表法來代替反復(fù)的運(yùn)算,這也同樣適用于CRC32的計(jì)算。本文所提供的程序庫中,函數(shù)crchware是一般的16位CRC的算法。mk-crctbl用以在內(nèi)存中建立一個CRC數(shù)值表。
參考資料來源:百度百科-CRC32
網(wǎng)站題目:c語言crc32函數(shù)使用,c語言實(shí)現(xiàn)crc
當(dāng)前網(wǎng)址:http://sd-ha.com/article22/hoocjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、網(wǎng)頁設(shè)計(jì)公司、定制網(wǎng)站、云服務(wù)器、小程序開發(fā)、關(guān)鍵詞優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)