1、CRC CRC真正的原理说明: 【CRC 校验的C语言实现:】 下面我们以CRC-16为例子说明任意长度数据流的CRC校验码生成过程。我们采用将数据流分成若干个8bit的字符,并由低字节到高字节传送的并行方法来求出crc校验码。具体过程:用一个16bit的寄存器存放CRC校验值,且设定其初始值为0x0000,将数据流的第一个8bit与16bit的CRC寄存器的高字节进行异或运算,并将结果存入CRC的高字节;CRC寄存器左移一位,最低位补0;同时检测移出最高位;若移出的最高位为0;则继续按上述方法左移,若最高位为1,则将CRC寄存器中的值与生成多项式码想异或,结果存入到CRC寄存器;继续左移并重
2、复上述处理方法,直到8bit数据处理完为止,则此时CRC寄存器中的值就是第一个8bit数据对应的CRC校验码;然后将此CRC寄存器的值作为初值,用同样的方法重复上述步骤来处理下一个8bit数据流,直到所有8bit字符都处理完毕,此时CRC寄存器的值即为整个数据流对应的CRC校验码。生成多项式对应的16进制为0x18005;由于CRC寄存器左移过程中,移出的最高一位为1时与之相异或,所以与16bit的CRC寄存器对应的生成多项式可用0x8005表示。下面给出处理8bit数据流得C源程序:Unsigned short crc_dsp(unsigned short reg, unsigned cha
3、r data_crc)/ reg :为crc寄存器;data_crc要处理的数据流 Unsigned short msb; / crc寄存器将移出的最高位1bit Unsigned short data; Unsigned short gx =0x8005, i= 0;/ i为左移次数gx为生成多项式 Data =(unsigned short)data_crc; Data =data 8; Reg = reg data; do msb =reg & 0x8000; reg =reg 1; if(msb = 0x8000) reg= reg gx; i+; while(i8); Return (reg); 【查表发求crc:】unsigned int table_crc(unsigned char *ptr,unsigned char len) unsigned char da; unsigned int crc =0; while(len-) da =(unsigned char )(crc/256); / crc 的高8位 crc =8; crc =crc_tada *ptr; /高字节和当前数据xor 再查表 ptr+; return crc;