Preface
CRC(Cyclic Redundancy Check)是数字通信系统中广泛使用的差错检测技术,本文将探究使用广泛的CRC查表法的原理实现细节,也作为一次学习记录总结。
一、CRC校验原理
CRC校验原理基于模二运算法,相关概念如下所示。
模二加减法
模二加减法是不带借位的运算法,本质上就是异或位运算,如下所示
1 1 0 1
± 1 0 0 1
-----------
0 1 0 0
模二除法
模二除法采用模二减法,被除数除以除数,所得余数作为新的被除数,余数首位为1,商为1,余数首位为0,商为0。
设M是被除数,G是除数,P为商,R为余数。M是报文数据101001,P是多项式x^3 + x ^2+ 1(3-bit CRC),首先将待计算报文LSB位后填充n bit(CRC校验的长度),再将填充后的报文数据与多项式模二除法运算,计算步骤如下:
从MSB bit 开始,每个bit与多项式异或运算的结果参与下一步的异或运算:
第一次:被除数首位为1,除以除数G,商为1;
第二次:新的被除数(余数)首位为1,除以除数G,商为1;
第三次:新的被除数首位为0,除以除数0,商为0;
第四次:新的被除数首位为1,除以除数G,商为1;
第五次:新的被除数首位为0,除以除数0,商为0;
第六次:新的被除数首位为1,除以除数G,商为1;
第六次除法后余数位数小于除数,运算结束。
二、CRC校验模型参数
多项式:CRC校验中的除数,对于同一个多项式,以x16+x15+x2+1为例,MSB-first code所表示的值为0x8005,LSB-first code所表示的值为0xA001,CRC计算根据需要使用其中一种code。
初始值: CRC校验的初始值,校验完成后的返回值
结果异或值: 与CRC校验结果异或的值
输入反转: CRC校验的输入值是否需要位反转
输出反转:CRC校验的结果值是否需要位反转
以下是不同CRC校验模型的参数(Polinomial使用MSB-first code)
三、查表法原理
1.计算单字节CRC校验值
以CRC-16/IBM 校验模型为例,多项式为x16+x15+x2+1,待计算数据为0x01,以下是计算CRC的python代码