CRC.docx
《CRC.docx》由会员分享,可在线阅读,更多相关《CRC.docx(8页珍藏版)》请在冰豆网上搜索。
CRC
CRC真正的原理说明:
●【CRC校验的C语言实现:
】
⏹下面我们以CRC-16为例子说明任意长度数据流的CRC校验码生成过程。
我们采用将数据流分成若干个8bit的字符,并由低字节到高字节传送的并行方法来求出crc校验码。
具体过程:
用一个16bit的寄存器存放CRC校验值,且设定其初始值为0x0000,将数据流的第一个8bit与16bit的CRC寄存器的高字节进行异或运算,并将结果存入CRC的高字节;CRC寄存器左移一位,最低位补0;同时检测移出最高位;若移出的最高位为0;则继续按上述方法左移,若最高位为1,则将CRC寄存器中的值与生成多项式码想异或,结果存入到CRC寄存器;继续左移并重复上述处理方法,直到8bit数据处理完为止,则此时CRC寄存器中的值就是第一个8bit数据对应的CRC校验码;然后将此CRC寄存器的值作为初值,用同样的方法重复上述步骤来处理下一个8bit数据流,直到所有8bit字符都处理完毕,此时CRC寄存器的值即为整个数据流对应的CRC校验码。
生成多项式对应的16进制为0x18005;由于CRC寄存器左移过程中,移出的最高一位为1时与之相异或,所以与16bit的CRC寄存器对应的生成多项式可用0x8005表示。
下面给出处理8bit数据流得C源程序:
Unsignedshortcrc_dsp(unsignedshortreg,unsignedchardata_crc)
//reg:
为crc寄存器;data_crc要处理的数据流
{
Unsignedshortmsb;//crc寄存器将移出的最高位1bit
Unsignedshortdata;
Unsignedshortgx=0x8005,i=0;//i为左移次数gx为生成多项式
Data=(unsignedshort)data_crc;
Data=data<<8;
Reg=reg^data;
do
{
msb=reg&0x8000;
reg=reg<<1;
if(msb==0x8000)
{
reg=reg^gx;
}
i++;
}while(i<8);
Return(reg);
}
【查表发求crc:
】
unsignedinttable_crc(unsignedchar*ptr,unsignedcharlen)
{
unsignedcharda;
unsignedintcrc=0;
while(len--)
{
da=(unsignedchar)(crc/256);//crc的高8位
crc<<=8;
crc^=crc_ta[da^*ptr];//高字节和当前数据xor再查表
ptr++;
}
returncrc;
}