CRC32的计算方法

Python020

CRC32的计算方法,第1张

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

为了提高编码效率,在实际运用中大多采用查表法来完成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 = 1i <(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 = 0i <= 0xFFi++)

{ temp=Reflect(i, 8)

crc32_table[i]= temp<<24

for (int j = 0j <8j++){

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)

}

}