博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CRC32校验算法C语言版(查表法)
阅读量:5845 次
发布时间:2019-06-18

本文共 1573 字,大约阅读时间需要 5 分钟。

hot3.png

最近用到CRC校验算法,就找了些资料,学习了一下,网上关于CRC32的资料也多,但感觉不是很完整,或者太高深。

CRC算法查表法很常见,但表是怎么来的,有些资料说得不很清楚。

我来说一下我的看法:

1.CRC校验变化太多,有CRC4/5/6/7/8/16/32,每一种的多项式也有很多种变化,并不是一成不变的;

2.输入输出方式也有区别,有一些初始值是0,有一些初始值是0xFFFFFFFF,有一些直接返回,有一些异或返回。

因此,CRC校验很难用一个代码兼容全部,只能根据项目需要修改相关参数了。

 

计算方法:

1.先要知道多项式是什么样子,以这个IEEE802.3标准CRC32多项式为例:x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x+ 1

2.转换成一个值(这个值的命名我不知道啊)

  x32  则对应32bit = 1, x26 则对应26bit=1,得出一个值:(1<<32)|(1<<26)|(1<<23)|(1<<22)|...|(1<<1)|(1)=0x104C11DB7,对于CRC32取低32位,则=0x4C11DB7

3.用这个值通过一定方法生成长度为256的码表,对于CRC32表内每个元素都为32bit.

4.用一定的方法查表得出CRC32值。

 

好了,可以贴代码了:

/** CRC校验算法,查表法* 
*/#include "crc.h"static unsigned long table[256];//位逆转static unsigned long bitrev(unsigned long input, int bw){ int i; unsigned long var; var = 0; for(i=0;i
>=1; } return var;}//码表生成//如:X32+X26+...X1+1,poly=(1<<26)|...|(1<<1)|(1<<0)void crc32_init(unsigned long poly){ int i; int j; unsigned long c; poly=bitrev(poly,32); for(i=0; i<256; i++) { c = i; for (j=0; j<8; j++) { if(c&1) { c=poly^(c>>1); } else { c=c>>1; } } table[i] = c; }}unsigned long crc32(unsigned long crc, void* input, int len){ int i; unsigned char index; unsigned char* pch; pch = (unsigned char*)input; for(i=0;i
>8)^table[index]; pch++; } return crc;}

 

 

测试用例:

 

void main(void){	unsigned long crc;	crc32_init(0x4C11DB7,table);	crc = 0xFFFFFFFF;	crc=crc32(crc,"1234567890",10);	crc ^= 0xFFFFFFFF;	printf("CRC32=%08X\n",crc);	system("pause");}

 

 

 

 

计算结果:

CRC32=0x261DAEE5

 

 



转载于:https://my.oschina.net/kerndev/blog/683243

你可能感兴趣的文章
UNIX字符转换程序
查看>>
SQL Server之备份和还原系统数据库
查看>>
Easyui NumberBox格式化展示
查看>>
批量修改Mysql数据库表MyISAM为InnoDB
查看>>
机房收费系统之余额查询
查看>>
cacti安装文档
查看>>
awk工具
查看>>
keepalived工作原理
查看>>
使用安全的Windows磁盘格式
查看>>
常见兼容性问题?
查看>>
一个重复try语句的实验
查看>>
Servlet进阶API
查看>>
我和ip_conntrack不得不说的一些事
查看>>
【web安全】跨站攻击思路整理
查看>>
数据库学习笔记-20170309
查看>>
机房收费系统之子窗体不显示问题
查看>>
疯狂ios讲义疯狂连载之显示动画
查看>>
对于大型数据库重新组织数据和生成索引进行维护的建议
查看>>
Windows Phone 7 Tips (8)
查看>>
Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和优势
查看>>