코딩 효율성을 높이기 위해 실제 응용에서는 룩업 테이블 방식을 주로 사용하여 CRC-32 검사를 완료합니다. 다음은 CRC-32 검사를 생성하는 서브루틴입니다.
부호 없는 긴 crc_32_tab[256]={
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a 3,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;
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; ;
}
매개변수 테이블은 먼저 PC에서 계산할 수도 있고 프로그램 초기화 중에 완료할 수도 있습니다. 다음은 Visual C++ 6.0에서 컴파일되고 전달되는 매개변수 테이블을 계산하는 데 사용되는 C 언어 서브루틴입니다.
#include
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 등을 교환합니다.
p>for(int i = 1; i < (ch + 1); i++)
{ if(ref & 1)
value |= 1 << ( ch - i);
ref >>= 1; }
반환 값
}
init_crc32_table( )
{ unsigned long int crc,temp;
// 256개 값
for(int i = 0; i <= 0xFF; i++)
{ temp=Reflect(i, 8);
crc32_table[i]= 임시 << 24
for (int j = 0; j < 8; j++){
부호 없는 long int t1,t2;
unsigned long int flag=crc32_table[i]&0x80000000; ] << 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)
p>}
}