crc校验c语言算法
⑴ c语言 编写一个程序 求输入一个数计算它的CRC值,
unsignedintcrc(unsignedchar*buf,unsignedcharlen)
{
chari;
unsignedintc_dat=0xffff;//有的CRC校验这个值是0
for(;len>0;len--)//
{
c_dat^=*buf;
for(i=0;i<8;i++)
{
if((c_dat&0x1)==0x1)
{
c_dat>>=1;
c_dat^=0xa001;
}
else
{
c_dat>>=1;
}
}
buf++;
}
returnc_dat;
}
⑵ crc16校验的c语言程序
unsigned short crc_dsp(unsigned short reg, unsigned char data_crc)
//reg为crc寄存器, data_crc为将要处理的8bit数据流
{
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(i < 8);
return (reg);
}
⑶ 请问:CRC是什么意思
CRC意思是循环冗余码校验。
校验原理:(M-R)/G=Q+0/G
说明:以接收到的校验码除以约定的除数,若余数为0,则可认为接收到的数据是正确的。
例:有效信息1101,生成多项式样1011
循环校验码解:
有效信息1101(k=4),即M(x)=x3+x2+x0,生成多项式1011(r+1=4,即r=3);
即G(x)=x3+x1+x0,M(x)·x3=x6+x5+x3,即1101000(对1101左移三位);
M(x)·x3/G(x)=1101000/1011=1111+001/1011即1010的CRC是:1101001。
(3)crc校验c语言算法扩展阅读:
CRC码集选择的原则:
若设码字长度为N,信息字段为K位,校验字段为R位(N=K+R),则对于CRC码集中的任一码字,存在且仅存在一个R次多项式g(x),使得
V(x)=A(x)g(x)=xRm(x)+r(x);
其中:m(x)为K次信息多项式,r(x)为R-1次校验多项式,
g(x)称为生成多项式:
g(x)=g0+g1x+g2x2+。。。+g(R-1)x(R-1)+gRxR
发送方通过指定的g(x)产生CRC码字,接收方则通过该g(x)来验证收到的CRC码字。