16位CRC校验原理与算法分析
这里,不讨论CRC的纠错原理以及为什么要选下面提及的生成多项式,只是针对以下的生成多项式,如何获得CRC校验码,作一个比较详细的说明。
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
CRC生成多项式如下表,
名称 生成多项式 简记式* 标准引用
CRC-4 x4+x+1 3 ITU G.704
CRC-8 x8+x5+x4+1 0x31
CRC-8 x8+x2+x1+1 0x07
CRC-8 x8+x6+x4+x3+x2+x1 0x5E
CRC-12 x12+x11+x3+x+1 80F
CRC-16 x16+x15+x2+1 8005 IBM SDLC
CRC16-CCITT x16+x12+x5+1 1021 ISO HDLC, ITU X.25,
V.34/V.41/V.42, PPP-FCS
CRC-32 x32+x26+x23+...+x2+x+1 04C11DB7 ZIP, RAR, IEEE 802
LAN/FDDI, IEEE 1394, PPP-FCS
CRC-32c x32+x28+x27+...+x8+x6+1 1EDC6F41 SCTP
生成多项式的最高位固定的1,故在简记式中忽略最高位1了,如0x1021实际是0x11021。
I、基本算法,人工笔算,,
以CRC16-CCITT为例进行说明,CRC校验码为16位,生成多项式17位。假如数据流为4字节,BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0],
数据流左移16位,相当于扩大256×256倍,再除以生成多项式0x11021,做不借位的除法运算,相当于按位异或,,所得的余数就是CRC校验码。 发送时的数据流为6字节,BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]、CRC[1]、CRC[0],
II、计算机算法1,比特型算法,,
1)将扩大后的数据流,6字节,高16位,BYTE[3]、BYTE[2],放入一个长度为16的寄存器,
2)如果寄存器的首位为1,将寄存器左移1位(寄存器的最低位从下一个字节获得),再与生成多项式的简记式异或,
否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得), 3)重复第2步,直到数据流,6字节,全部移入寄存器,
4)寄存器中的值则为CRC校验码CRC[1]、CRC[0]。
III、计算机算法2,字节型算法,,256^n表示256的n次方
把按字节排列的数据流表示成数学多项式,设数据流为BYTE[n]BYTE[n,1]BYTE[n,2]、、、BYTE[1]BYTE[0],表示成数学表达式为BYTE[n]×256^n+BYTE[n-1]×256^(n-1)
+...+BYTE[1]*256+BYTE[0],在这里+表示为异或运算。设生成多项式为G17,17bit,,CRC码为CRC16。
则,CRC16,(BYTE[n]×256^n+BYTE[n-1]×256^(n-1)+...+BYTE[1]×256+BYTE[0])×256^2
/G17,即数据流左移16位,再除以生成多项式G17。
先变换BYTE[n-1]、BYTE[n-1]扩大后的形式,
CRC16,BYTE[n]×256^n×256^2/G17+BYTE[n-1]×256^(n-1)×256^2/G17+...+BYTE[1]×256×256^2/G17+BYTE[0]×256^2/G17
,(Z[n]+Y[n]/G17)×256^n+BYTE[n-1]×256^(n-1)×256^2/G17+...+BYTE[1]×256×256^2/G17+BYTE[0]×256^2/G17
,Z[n]×256^n+{Y[n]×256/G17+BYTE[n-1]×256^2/G17}×256^(n-1)+...+BYTE[1]×256×256^2/G17+BYTE[0]×256^2/G17
,Z[n]×256^n+{(YH8[n]×256+YHL[n])×256/G17+BYTE[n-1]×256^2/G17}×256^(n-1)+...+BYTE[1]×256×256^2/G17+BYTE[0]×256^2/G17
,Z[n]×256^n+{YHL[n]×256/G17+(YH8[n]+BYTE[n-1])×256^2/G17}×256^(n-1)+...+BYTE[1]×256×256^2/G17+BYTE[0]×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]。
字节型算法的一般描述为,本字节的CRC码,等于上一字节CRC码的低8位左移8位,与上一字节CRC右移8位同本字节异或后所得的CRC码异或。
字节型算法如下,
1)CRC寄存器组初始化为全"0"(0x0000)。,注意,CRC寄存器组初始化全为1时,最后CRC应取反。,
2)CRC寄存器组向左移8位,并保存到CRC寄存器组。
3)原CRC寄存器组高8位,右移8位,与数据字节进行异或运算,得出一个指向值表的索引。
4)索引所指的表值与CRC寄存器组做异或运算。
5)数据指针加1,如果数据没有全部处理完,则重复步骤2)。
6)得出CRC。
unsigned short GetCrc_16(unsigned char * pData, int nLength) //函数功能,计算数据流* pData的16位CRC校验码,数据流长度为nLength {
unsigned short cRc_16 = 0x0000; // 初始化
while(nLength>0)
{
cRc_16 = (cRc_16 << 8) ^ cRctable_16[((cRc_16>>8) ^ *pData) &
0xff]; //cRctable_16表由函数mK_cRctable生成
nLength--;
pData++;
}
return cRc_16;
}
void mK_cRctable(unsigned short gEnpoly) //函数功能,生成0,255对应的16CRC校验码,其实就是计算机算法1,比
特型算法,
//gEnpoly为生成多项式
//注意,低位先传送时,生成多项式应反转(低位与高位互换)。如CRC16-CCITT
为0x1021,反转后为0x8408
{
unsigned short cRc_16=0;
unsigned short i,j,k;
for(i=0,k=0;i<256;i++,k++)
{
cRc_16 = i<<8;
for(j=8;j>0;j--)
{
if(cRc_16&0x8000) //反转时cRc_16&0x0001
cRc_16=(cRc_16<<=1)^gEnpoly; //反转时cRc_16=(cRc_16>>=1)^gEnpoly
else
cRc_16<<=1; //反转时cRc_16>>=1
//表示的是 cRc_16 = cRc_16<<1;
}
cRctable_16[k] = cRc_16;
}
}