CRC 算法及验证示例

本文主要是CRC 算法的一个实现,附加了一个测试示例。

其中算法部分取自如下网址:

http://dev.csdn.net/author/dishening7/6a554842935b45e4ad679945950de8d5.html

 

/* * CRC通用算法 * * version 1.0 * * by Yinpei * * Wuhan University * * 2006年11月18日 * */ #include <stdio.h> #define CRC_NUM_N 16 //定义每种CRC的校验码比特数 #define LIMIT_MASK_N 0xFFFF //定义每种CRC校验码的最大值 #define MSB_MASK_N 0x8000 //用于检测CRC校验码左移一位后是否会溢出(所占比特数超出CRC_NUM_N) #define R_N 0x1021 //根据N次生成多项式得到的1的对应的余数多项式对应CRC(0相应的余数为0) // #define CRC_NUM_N 16 //定义每种CRC的校验码比特数 /* CRC_NUM_32 == 32 CRC_NUM_24 == 24 CRC_NUM_16 == 16 CRC_NUM_12 == 12 CRC_NUM_8 == 8 CRC_NUM_4 == 4 */ // #define LIMIT_MASK_N 0xFFFF //定义每种CRC校验码的最大值 /* LIMIT_MASK_32 == 0xFFFFFFFF LIMIT_MASK_24 == 0xFFFFFF LIMIT_MASK_16 == 0xFFFF LIMIT_MASK_12 == 0xFFF LIMIT_MASK_8 == 0xFF LIMIT_MASK_4 == 0xF */ // #define MSB_MASK_N 0x8000 //用于检测CRC校验码左移一位后是否会溢出(所占比特数超出CRC_NUM_N) /* MSB_MASK_32 == 0x80000000 MSB_MASK_24 == 0x800000 MSB_MASK_16 == 0x8000 MSB_MASK_12 == 0x800 MSB_MASK_8 == 0x80 MSB_MASK_4 == 0x8 */ // #define R_N 0x1021 //根据N次生成多项式得到的1的对应的余数多项式对应CRC(0相应的余数为0) /* g_24(D)=D24+D23+D6+D5+D+1 : R_24 == 1000 0000 0000 0000 0110 0011 == 0x800063 g_16(D)=D16+D12+D5+1 : R_16 == 1000000100001 == 0x1021 g_12(D)=D12+D11+D3+D2+D+1 : R_12 == 100000001111 == 0x80F g_8(D) =D8+D7+D4+D3+D+1 : R_8 == 10011011 == 0x9B g_4(D) =D4+D3+D2+1 : R_4 == 1101 == 0xD */ //N表示生成多项式的最高阶数,常见如32、24、16、12、8、4 unsigned int cal_crcN(unsigned char *ptr, unsigned int len){ unsigned int i; unsigned int crc=0; while(len--!=0){ //此处迭代变量为0x80,表示以字节为单位存储源数据,并且每个字节迭代8次,分别处理每个位 for(i=0x80; i!=0; i/=2){ //通过MSB_MASK_N检测CRC校验码左移一位后是否会溢出 if((crc&MSB_MASK_N)!=0){ //如果会溢出 crc*=2; crc&=LIMIT_MASK_N;//取有效比特位,使其在CRC_NUM_N内 crc^=R_N; } /* 余式CRC 乘以2 再求CRC */ else crc*=2; if((*ptr&i)!=0) crc^=R_N; /* 再加上本位的CRC */ } ptr++; } return(crc); } //验证程序 int main() { FILE *fp; int i=0,length=0,res_crc=0; //fp = fopen("preboot.bin","rb"); fp = fopen("u-boot_b_1.bin","rb"); if(fp==NULL) printf("%s","error/n"); printf("%s","success/n"); char tst[222000]="a"; /*for (i=0;i<769;i++){ tst[i]=fgetc(fp); }*/ while(!feof(fp)){ tst[i++]=fgetc(fp); } length=i-1; res_crc=cal_crcN(tst,length); printf("res_crc=%x/n",res_crc); printf("length=%d/n",i); }

 

你可能感兴趣的:(算法,File,测试,null,存储,FP)