c语言中crc32参数介绍,crc32校验的c语言实现

#includeuint32_t crc32_table[256];

int make_crc32_table()

{

uint32_t c;

int i = 0;

int bit = 0;

for(i = 0; i < 256; i++)

{

c = (uint32_t)i;

for(bit = 0; bit < 8; bit++)

{

if(c&1)

{

c = (c >> 1)^(0xEDB88320);

}

else

{

c = c >> 1;

}

}

crc32_table[i] = c;

}

}

uint32_t make_crc(uint32_t crc, unsigned char *string, uint32_t size)

{

while(size--)

crc = (crc >> 8)^(crc32_table[(crc ^ *string++)&0xff]);

return crc;

}

void compare_crc(char *filename)

{

FILE *sp = NULL;

uint32_t srcCrc ;

uint32_t calcuCrc = 0xffffffff;

unsigned char buf[1024];

uint32_t count;

if(filename == NULL)

{

printf("filename is null

");

exit(1);

}

sp = fopen(filename, "rb");

if(sp == NULL)

{

printf("open file fail

");

exit(1);

}

fread(&srcCrc, 1, 4, sp);

printf("In %s: src crc is 0x%x

", __FUNCTION__, srcCrc);

if(sp)

{

while(!feof(sp))

{

memset(buf, 0, sizeof(buf));

count = fread(buf, 1, sizeof(buf), sp);

calcuCrc = make_crc(calcuCrc, buf, count);

}

}

printf("In %s: calcuCrc is 0x%x

", __FUNCTION__, calcuCrc);

fclose(sp);

if(srcCrc == calcuCrc)

{

printf("In %s: the calculate crc equal the src crc in file

", __FUNCTION__);

}

else

{

printf("In %s: the calculate crc not equal the src crc in file

", __FUNCTION__);

}

}

int main()

{

int i;

FILE *sp = NULL;

FILE *dp = NULL;

uint32_t count;

uint32_t crc = 0xFFFFFFFF;

unsigned char buf[1024];

make_crc32_table();

sp = fopen("/home/user/work_soft/crc_check/bak/test.txt", "rb");

if(sp == NULL)

{

printf("open file error

");

return -1;

}

dp = fopen("/home/user/work_soft/crc_check/bak/testcrc.txt", "wb");

if(dp == NULL)

{

printf("open file error

");

return -1;

}

if(sp)

{

while(!feof(sp))

{

memset(buf, 0, sizeof(buf));

count = fread(buf, 1, sizeof(buf), sp);

crc = make_crc(crc, buf, count);

}

}

printf("In main: calculate crc is 0x%x

", crc);

if(dp)

{

fwrite(&crc, 1, 4, dp);//write the crc into the file testcrc.txt

fseek(sp, 0, SEEK_SET);

while(!feof(sp))

{

memset(buf, 0, sizeof(buf));

count = fread(buf, 1, sizeof(buf), sp);

fwrite(buf, 1, count, dp);

}

fclose(sp);

fclose(dp);

}

/*compare crc*/

compare_crc("/home/user/work_soft/crc_check/bak/testcrc.txt");

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值