CRC校验字节型算法查表法解读(备忘)
本文本人很喜欢,系转载转自:http://blog.csdn.net/suding666/article/details/8078708,若转载对作者本人有侵犯,请作者及时与本人联系,定将删除。
以下为转载: http://hi.baidu.com/zhangshe/blog/item/0805e95c2a649647fbf2c0f4.html
CRC校验 crc算法已经有成熟和比较经典的现成代码可供我们利用。CRC计算可以靠专用的硬件来实现,但是对于低成本的微控制器系统,在没有硬件支持下实现CRC检验,关键的问题就是如何通过软件来完成CRC计算,也就是CRC算法的问题。CRC校验的基本思想是利用线性编码理论,在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的监督码(既CRC码)r位,并附在信息后边,构成一个新的二进制码序列数共(k+r)位,最后发送出去。在接收端,则根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。 1.生成多项式。 标准CRC生成多项式如下表: 名称 生成多项式 简记式* 标准引用 II、计算机算法1(比特型算法): III、计算机算法2(字节型算法):256^n表示256的n次方 +...+BYTE[1]*256+BYTE[0],在这里+表示为异或运算。设生成多项式为G17(17bit),CRC码为CRC16。 该结果单独计算CRC校验码(即单字节的16位CRC校验码,对单字节可建立表格,预先生成对应的16位CRC校验码),所得的CRC校验码与上一字节CRC校验码Y[n]的低8位(YL8[n]) 乘以256(即左移8位)异或。然后依次逐个字节求出CRC,直到BYTE[0]。 unsigned short GetCrc_16(unsigned char * pData, int nLength)
for(i=0,k=0;i<256;i++,k++) 2:CRC码集选择的原则 若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得 V(x)=A(x)g(x)=xRm(x)+r(x); 其中: m(x)为K次信息多项式, r(x)为R-1次校验多项式, g(x)称为生成多项式: g(x)=g0+g1x+ g2x2+...+g(R-1)x(R-1)+gRxR 发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。 3、CRC校验码软件生成方法: 借助于多项式除法,其余数为校验字段。 例如:信息字段代码为: 1011001;对应m(x)=x6+x4+x3+1 假设生成多项式为:g(x)=x4+x3+1;则对应g(x)的代码为: 11001 x4m(x)=x10+x8+x7+x4 对应的代码记为:10110010000; 采用多项式除法: 得余数为: 1010 (即校验字段为:1010) 发送方:发出的传输字段为: 1 0 1 1 0 0 1 1 0 10 信息字段 校验字段 接收方:使用相同的生成码进行校验:接收到的字段/生成码(二进制除法), 如果能够除尽,则正确。
以上字节型算法(红字部分)解读: |
比特型算法较易理解,这里不做解释.一般我们应用中更多的是用字节型的算法,而大部字节型算法为了提高效率是利用查表法实现的,对于查表法,表是如何产生的,有时迷惑,所以在此对字节型查表法推导过程的理解做一个备忘:
由等式一到等式二的推导:Z[n] 和Y[n]分别为BYTE[N]/G17的商和余子式,所以可以进行转换;其它的BYTE暂不变;
由等式二到等式三的推导:由于只关心余子式,所以可以不理Z[n],对Y[n]与后一字节进行进一步的结合处理,提取256^(n-1);
由等式三到等式四的推导:把Y[n]进一步分解成高低8位Y[n]×256/G17 = (YH8[n]×256+YL8[n])×256/G17;
由等式四到等式五的推导:重新组合得{YHL[n]×256/G17+(YH8[n]+BYTE[n-1])×256^2/G17};
这样就推导出,BYTE[n-1]字节的CRC校验码为{YHL[n]×256/G17+(YH8[n]+BYTE[n-1])×256^2/G17},即上一字节CRC校验码Y[n]的高8位(YH8[n])与本字节BYTE[n-1]异或,该结果单独计算CRC校验码(即单字节的16位CRC校验码,对单字节可建立表格,预先生成对应的16位CRC校验码),所得的CRC校验码与上一字节CRC校验码Y[n]的低8位(YL8[n])乘以256(即左移8位)异或。然后依次逐个字节求出CRC,直到BYTE[0]。
表的生成则是对0~255每个数进行求CRC得到的!
(END)
转自: http://blog.csdn.net/suding666/article/details/8078708