(原创)CRC计算流程分析(RefIn,Init,RefOut,XorOut)

CRC的计算流程

(原创)CRC计算流程分析(RefIn,Init,RefOut,XorOut)_第1张图片

以此CRC计算程序为例,

1、输入:原数据是ASCII码的“A”,对应二进制数据“0100 0001”

2、选择校验方式,以CRC-4/ITU为例,多项式为x4+x+1对应二进制:10011

(原创)CRC计算流程分析(RefIn,Init,RefOut,XorOut)_第2张图片

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的用法,再举一个例子:

(原创)CRC计算流程分析(RefIn,Init,RefOut,XorOut)_第3张图片

原始数据“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

 

你可能感兴趣的:((原创)CRC计算流程分析(RefIn,Init,RefOut,XorOut))