?? 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 + -