c语言crc32函数使用,c语言实现crc

CRC32 算法

为了提高编码效率,在实际运用中大多采用查表法来完成CRC-32校验,下面是产生CRC-32校验吗的子程序。

创新互联公司服务项目包括孝感网站建设、孝感网站制作、孝感网页制作以及孝感网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,孝感网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到孝感省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

unsigned long crc_32_tab[256]={

0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,0x0edb8832,…, 0x5a05df1b, 0x2d02ef8d

};//事先计算出的参数表,共有256项,未全部列出。

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; //要移出的字节的值

oldcrc=crc_32_tab[t]; //根据移出的字节的值查表

c=DataBuf[charcnt]; //新移进来的字节值

oldcrc32= (oldcrc32 8) | c; //将新移进来的字节值添在寄存器末字节中

oldcrc32=oldcrc32^oldcrc; //将寄存器与查出的值进行xor运算

charcnt++;

}

crc32=oldcrc32;

return crc32;

}

参数表可以先在PC机上算出来,也可在程序初始化时完成。下面是用于计算参数表的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);

}

}

CRC32的算法

通常的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 CRCCCITT0x1021#define CCITT-REV0x8408#define CRC160x8005#define CRC16-REV0xA001#define CRC32-POLYNOMIAL0xEDB88320L/*以上为CRC除数的定义*/#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])/*以上两个宏可以代替函数crcupdate和crcrevupdate*/#include stdio.h#include stdlib.h#include alloc.h/*函数crchware是传统的CRC算法,其返回值即CRC值*/unsigned short crchware(data,genpoly,accum)unsigned short data;/*输入的数据*/unsigned short genpoly;/*CRC除数*/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);}/*函数mk-crctbl利用函数crchware建立内存中的CRC数值表*/unsigned short *mk-crctbl(poly,crcfn);unsigned short poly;        /*CRC除数--CRC生成多项式*/Runsigned short(*crcfn)();  /*指向CRC函数(例如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;}/*函数mk-crctbl的使用范例*/if((crctblp=mk-crctbl(CRCCCITT,crchware))==NIL){    puts(insuffmemoryforCRClookuptable.n);    return1;*/    /*函数crcupdate用以用查表法计算CRC值并更新CRC累加器值*/    voidcrcupdate(data,accum,crctab)    unsignedshortdata;/*输入的数据*/    unsignedshort*accum;/*指向CRC累加器的指针*/    unsignedshort*crctab;/*指向内存中CRC表的指针*/    {        staticshortcomb-val;        comb-val=(*accum8)^data;        *accum=(*accum8)^crctab[comb-val];    }    /*函数crcrevhware是传统的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;    }    /*函数crcrevupdate用以用反序查表法计算CRC值并更新CRC累加器值*/    voidcrcrevupdate(data,accum,crcrevtab)    unsignedshortdata;    unsignedshort*accum;DvNews2.

crc32 — 计算一个字符串的 crc32 多项式

CRC32的计算方法

CRC的本质是模-2除法的余数,采用的除数不同,CRC的类型也就不一样。通常,CRC的除数用生成多项式来表示。 最常用的CRC码及生成多项式名称生成多项式。

CRC-12:

CRC-16:

CRC-CCITT:

CRC-32:

CRC校验实用程序库 在数据存储和数据通讯领域,为了保证数据的正确,就不得不采用检错的手段。在诸多检错手段中,CRC是最著名的一种。CRC的全称是循环冗余校验。

扩展资料

通常的CRC算法在计算一个数据段的CRC值时,其CRC值是由求解每个数值的CRC值的和对CRC寄存器的值反复更新而得到的。这样,求解CRC的速度较慢。通过对CRC算法的研究,我们发现:一个8位数据加到16位累加器中去,只有累加器的高8位或低8位与数据相作用,其结果仅有256种可能的组合值。

因而,我们可以用查表法来代替反复的运算,这也同样适用于CRC32的计算。本文所提供的程序库中,函数crchware是一般的16位CRC的算法。mk-crctbl用以在内存中建立一个CRC数值表。

参考资料来源:百度百科-CRC32


名称栏目:c语言crc32函数使用,c语言实现crc
标题URL:http://pwwzsj.com/article/hoocjc.html