📄 crc.txt
字号:
/*###################################################################
发送端CRC-CCITT校验(加16位校验比特)以及接收端检验
CRC-CCITT(D)=D^16+D^12+D^5+1
##################################################################*/
void crc_ccitt( int *transport_block, //传输块输入
int transport_block_size) //加CRC校验比特(16)后的传输块大小
{ int CRCccitt,i,j;
int temp,crc_register[16];
CRCccitt=16;
for(i=0;i<CRCccitt;i++)
{
crc_register[i]=0; //给各个寄存器赋初值0
}
for (i=0;i<transport_block_size-CRCccitt;i++)
{
temp=(transport_block[i]+crc_register[CRCccitt-1])%2;
for(j=CRCccitt-1;j>0;j--)
{
crc_register[j]=crc_register[j-1];
}
crc_register[0]=temp;
crc_register[5]=(temp+crc_register[5])%2;
crc_register[12]=(temp+crc_register[12])%2;
}
for (i=0;i<16;i++)
{
transport_block[transport_block_size-1-i]=(crc_register[i]+1)%2;//校验位取反
}
return; //输出的数据块长度为原传输块长度与CRCccitt之和
}
//---------------------------------------------------------------------/
//接收端检验
int crcccitt_value( int *transport_block,int transport_block_size)
{
int temp,buffer,t[200];
unsigned int reg=0;
int i;
for (i=0;i<transport_block_size;i++)
{
t[i]=transport_block[i];
}
for (i=0;i<transport_block_size;i++)
{
transport_block[i]=t[transport_block_size-1-i];
}
for (i=0;i<16;i++)
{
transport_block[transport_block_size-1-i]=(transport_block[transport_block_size-1-i]+1)%2;
}//接收端校验位取反
for (i=0;i<transport_block_size;i++)
{
temp=(transport_block[i]+(reg&0x01))%2;//reg[15]与信息位模二加
reg=(unsigned int)((reg>>1)|(temp<<15));//循环右移,reg[4]变成reg[5]
buffer=(((reg>>10)&0x01)+temp)%2;//取reg[5]与输出位模二加,其结果存入
reg=(unsigned int)((reg&0xfbff)|(buffer<<10)); //新reg[5]
buffer=(((reg>>3)&0x01)+temp)%2;//取reg[12]与输出位模二加,其结果存入
reg=(unsigned int)((reg&0xfff7)|(buffer<<3)); //新reg[12]
}
return reg; //输出CRCccitt校验值,若非全零则传输有误
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -