一、模2运算
模2运算是一种二进制算法,CRC校验技术中的核心部分,因此,我们在分析CRC算法之前,必须掌握模2运算的规则。与四则运算相同,模2运算也包括模2加、模2减、模2乘、模2除四种二进制运算。而且,模2运算也使用与四则运算相同的运算符,即“+”表示模2加,“-”表示模2减,“×”或“·”表示模2乘,“÷”或“/”表示模2除。与四则运算不同的是模2运算不考虑进位和借位,即模2加法是不带进位的二进制加法运算,模2减法是不带借位的二进制减法运算。这样,两个二进制位相运算时,这两个位的值就能确定运算结果,不受前一次运算的影响,也不对下一次造成影响。
①模2加法运算定义为: 0+0=0 0+1=1 1+0=1 1+1=0 例如0101+0011=0110,列竖式计算: 0 1 0 1 + 0 0 1 1 ────── 0 1 1 0②模2减法运算定义为: 0-0=0 0-1=1 1-0=1 1-1=0 例如0110-0011=0101,列竖式计算: 0 1 1 0 - 0 0 1 1 ────── 0 1 0 1
③模2乘法运算定义为: 0×0=0 0×1=0 1×0=0 1×1=1 多位二进制模2乘法类似于普通意义上的多位二进制乘法,不同之处在于后者累加中间结果(或称部分积)时采用带进位的加法,而模2乘法对中间结果的处理方式采用的是模2加法。例如1011×101=100111,列竖式计算: 1 0 1 1 × 1 0 1 ────── 1 0 1 1 0 0 0 0 + 1 0 1 1 ──────── 1 0 0 1 1 1
④模2除法运算定义为: 0÷1=0 1÷1=1 多位二进制模2除法也类似于普通意义上的多位二进制除法,但是在如何确定商的问题上两者采用不同的规则。后者按带借位的二进制减法,根 据余数减除数够减与否确定商1还是商0,若够减则商1,否则商0。多位模2除法采用模2减法,不带借位的二进制减法,因此考虑余数够减除数与否是没有意义 的。实际上,在CRC运算中,总能保证除数的首位为1,则模2除法运算的商是由余数首位与除数首位的模2除法运算结果确定。因为除数首位总是1,按照模2 除法运算法则,那么余数首位是1就商1,是0就商0。例如1100100÷1011=1110……110,列竖式计算:
(1)一步步的计算方法:
模2除法与长除法类似,但有个特点:不借位。说白了就是按位异或,相同为0,不同为1。 它有三个原则: 1、除数与被除数最高几位(与除数位数相同)做异或,商1。(除数首位必须为1) 2、余数先去掉首位,若此时余数最高位为1,商1,并对以它为除数继续模2除。 若最高位为0,则商0,重复步骤2。 3、直到余数位数小于除数位数时,运算结束。
(2)熟悉规则之后,比较简洁的方法
1、当余数位数与除数位数相同时,才进行异或运算,余数首位是1,商就是1,余数首位是0,商就是0。
2、当已经除了几位后,余数位数小于除数,商0,余数往右补一位,位数仍比除数少,则继续商0,当余数位数和除数位数一样时,商1,进行异或运算,得新的余数,以此至被除数最后一位。
二、CRC码生成
1.概述
CRC即Cyclic Redundancy Check,循环冗余校验,是一种数字通信中的常用信道编码技术。其特征是信息段和校验字段的长度可以任意选定。
2.CRC校验的基本原理:
CRC码是由两部分组成的,前部分是信息码,就是需要校验的信息,后部分是校验码,如果CRC码长共n bit,信息码长k bit,就称为(n,k)码,剩余的r bit即为校验位。如:(7,3)码:110 1001,前三位110为信息码,1001为校验码。
3.校验码的生成规则:
1)将原信息码左移r bit,右侧补零,如 110--> 110 0000;
2)用110 0000除以g(x) (注意,使用的是模2除法,见下文),得到的余数即为CRC校验码;
3)将校验码续接到信息码的尾部,形成CRC码。
4.关于生成多项式g(x)
在产生CRC校验码时,要用到除法运算,一般来说,这是比较麻烦的,因此,把二进制信息预先转换成一定的格式,这就是CRC的多项式表示。二进制数表示为生成多项式的系数,如下:
所有二进制数均被表示为一个多项式,x仅是码元位置的标记,因此我们并不关心x的取值,称之为码多项式。(我没研究过CRC代数推理过程,没体会到用多项式计算的方便之处,这里要学会的就是给出生成多项式g(x),能写出对应的二进制即可)