CRC 32 校验
2016-05-19 13:57
686 查看
CRC即循环冗余校验码(Cyclic Redundancy Check[1] )。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。
参数模型
这个很重要,计算CRC值时,不仅仅是生成项POLY会影响到CRC值,还有很多参数会影响到最终的CRC值! 我也是查了很久才知道,晕死,在网上找了好多算法,都不是我要的结果(和另一端校验值相等的结果,另一端是个糊涂人,也不知道参数模型,不知道从哪找的例子,copy出来就用,可惜是fpga语言,上位机不能用,可苦了我了)。
CRC计算,需要有CRC参数模型,比如CRC32的参数模型是:
Width : 32
Poly : 04C11DB7
RefIn : True
RefOut : True
XorOut : FFFFFFFF
在这里记录一下crc 32的生成代码。
CRC-32的预置码表
计算时要选取一个多项式作为除数,一般CRC-32选取如下三个多项式值中的一个
Polynomial representations
Normal :0x04C11DB7
Reversed :0xEDB88320
Reversed reciprocal :0x82608EDB
在实际数据通讯时,信息字节先传送或先接收低位字节,这时候使用翻转反转多项(这样避免翻转数据,增加运算量)
CRC 32
余数初始值(Initial value):0xFFFFFFFF
结果异或值 (Final XOR value):0xFFFFFFFF
我使用的是另一种, MPEG-2的参数模型,这里先不列出来代码了。其实只是涉及到了位的反转
原理详见
https://en.wikipedia.org/wiki/Cyclic_redundancy_check
参数模型
这个很重要,计算CRC值时,不仅仅是生成项POLY会影响到CRC值,还有很多参数会影响到最终的CRC值! 我也是查了很久才知道,晕死,在网上找了好多算法,都不是我要的结果(和另一端校验值相等的结果,另一端是个糊涂人,也不知道参数模型,不知道从哪找的例子,copy出来就用,可惜是fpga语言,上位机不能用,可苦了我了)。
CRC计算,需要有CRC参数模型,比如CRC32的参数模型是:
Width : 32
Poly : 04C11DB7
RefIn : True
RefOut : True
XorOut : FFFFFFFF
在这里记录一下crc 32的生成代码。
CRC-32的预置码表
计算时要选取一个多项式作为除数,一般CRC-32选取如下三个多项式值中的一个
Polynomial representations
Normal :0x04C11DB7
Reversed :0xEDB88320
Reversed reciprocal :0x82608EDB
在实际数据通讯时,信息字节先传送或先接收低位字节,这时候使用翻转反转多项(这样避免翻转数据,增加运算量)
static uint CRC32_Tbl[256]; //用来保存CRC32码表 void GenCrc32Tbl() { uint CRC; for(int i=0; i<256; i++) { CRC=i; //这个循环实际上就是用"计算法"来求取CRC的校验码 for(int j=0; j<8; j++){ if(CRC&1)//最高位为1,将它与poly做XOR运算 CRC=(CRC>>1)^0xEDB88320;//0xEDB88320是选的CRC-32多项表达式的值 else //否则我们只是将左移一位 翻转多项式是右移一位 CRC>>=1; } CRC32_Tbl[i]=CRC; } }
CRC 32
余数初始值(Initial value):0xFFFFFFFF
结果异或值 (Final XOR value):0xFFFFFFFF
uint Get_CRC32(const unsigned char *buf, int size) { uint i, CRC; CRC = 0xFFFFFFFF;//#define INIT 0xFFFFFFFF // 余数初始值 Initial value for (i = 0; i < size; i++) CRC = CRC32_Tbl[(CRC ^ buf[i]) & 0xff] ^ (CRC >> 8); return CRC^0xFFFFFFFF;//#define XOROT 0xFFFFFFFF // 结果异或值 Final XOR value }
我使用的是另一种, MPEG-2的参数模型,这里先不列出来代码了。其实只是涉及到了位的反转
原理详见
https://en.wikipedia.org/wiki/Cyclic_redundancy_check
相关文章推荐
- 代码加约束Masonry的使用(快速上手Autolayout)及MMPlaceHolder标尺插件的使用
- 多项式乘积(Java)
- 替代CardView实现圆角图的第三方控件
- 动态规划算法
- mysql存储引擎测试
- ListView用法总结
- 微信公众平台订阅号,服务号和企业号三者之间的区别与联系
- log的用法(可以说是淋漓尽致了)
- cocos2dx 在android手机输入特殊字符导致程序崩溃
- server u 因为名称的汉字部分文档上传不了
- 快速排序算法
- UITableView的属性和方法
- Android中Bitmap和Drawable
- 常用搜索引擎使用技巧
- java基础部分之环境配置(最最基础部分哦)
- easyui datagrid使用updateRow更改单元格值后getChanges无法获取
- 做弹性的云—腾讯云弹性伸缩震撼来袭
- ios app 支持 ipv6-only
- 浏览器缓存Last-modified
- Unity 基础 - 脚本的生命周期