CRC的计算流程
以此CRC计算程序为例,
1、输入:原数据是ASCII码的“A”,对应二进制数据“0100 0001”
2、选择校验方式,以CRC-4/ITU为例,多项式为x4+x+1对应二进制:10011
3、参数Info
1)Name:CRC校验算法的名称(CRC-4/ITU);
2)Width:CRC校验值的长度(此例中10011长度为5);
3)Poly:多项式(省略了最高位的1;即10011==》0011=0x3);
4)RefIn:输入反转,为ture时反转,false时不反转
RefIn的反转:
在计算输入反转时,反转的操作是针对每一个字节的bit位进行反转,字节数据之间仍保持原有顺序
5)Init:该参数的值有两种形式:全为0,全为1
在判定并执行RefIn之后:
当Init全为1时,表示在算法开始前对数据的前CRC位数(高位)先和对应位数个1进行异或(即:前CRC位数的值按位取反),再在后面补上CRC位数个0,才进行后续计算。
当Init全为0时,在算法开始前对数据(这个数据是根据RefIn的值得到的)后面补上CRC位数个0后就可以进行后续计算;
6)RefOut-输出反转
备注:RefIn和RefOut这两个值同时为ture或者同时为false
RefOut的反转:
是将计算获得的CRC码整体进行反转,而不是像RefIn一样仅反转字节内的bit;
6)XorOut:表示执行完RefOut之后,对结果进行异或全0或者全1(该例中为全0异或)。
7)本例计算过程如下:
原始数据“A”对应的ASCII码得到数据1:0100 0001
采用了CRC-4/ITU多项式X4+X+1的算法,得到除数数据2:10011
由于RefIn=ture,输入数据进行反转,并补4个0,得到数据3:1000 0010 0000
数据3(被除数)和数据2(除数)做模2除法,得到数据3:1000
RefOut为ture且XorOut=0x00,输出数据进行反转,然后和0000进行异或,得到最终的校验码:CRC=0001
9)关于XorOut的用法,再举一个例子:
原始数据“A”对应的ASCII码得到数据1:0100 0001
采用了CRC-5/USB多项式X5+X2+1的算法,得到除数数据2:100101
先反转(反转的优先级高于Init的计算优先级),数据3:1000 0010
数据3的最高5位(width)的和Init:11111异或,得到数据4:111 1010
补5位(width)得到数据6:111 1010 00000
数据6与数据2,模2除法,得到数据7:01011
由于RefOut=ture,反转数据7得到数据8:11010
由于XorOut=0x1F=11111,数据8与11111进行异或运算,得到最终CRC:00101