=0;i--)if(num>=1return(i+1);}}intCRC_4(intmsgcode)/*CRC编码,生成包含信息码部分和冗余部分的CRC冗余码*/{intmsg_len=0;/*信息码长度*/intgen" />

CRC校验代码

#include "stdio.h"
#include "conio.h"



int cnt_bit(int num) /* 计算二进制位数 */
{
if(num<0) return 16;
else
{
int i;
for(i=14;i>=0;i--)
if(num>=1<return (i+1);

}

}

int CRC_4(int msgcode) /* CRC编码,生成包含信息码部分和冗余部分的CRC冗余码 */
{
int msg_len=0; /* 信息码长度 */
int gencode=(1<<4)+(1<<1)+1; /* G(x)=x4+x+1 */
int gen_len=4; /* 产生码长度 */
int n=0; /* 信息码长度与产生码长度之和 */
int trancode=0; /* CRC最终冗余码 */

msg_len=cnt_bit(msgcode);
n=msg_len+gen_len;

if(n>16) return -1; /* 信息码长度与产生码长度之和大于16位,则产生溢出信号 */
else
{
int msgtemp=msgcode<int result=msgtemp;
int gentemp=gencode<<(msg_len-1);

int i=msg_len;

while(i>0) /* 用异或实现模2除法 */
{
if(cnt_bit(result)==n)
result=result^gentemp;

result=result<<1;
i--;

}


if(cnt_bit(result)==n) /* 将余数最高位保留在最终冗余码中 */
trancode=msgtemp+(1<<(gen_len-1));
else
trancode=msgtemp;

result=result&((1<<(n-1))-1); /* 去掉余数最高位 */
result=result>>msg_len; /* 余数右移 */

trancode=trancode+result;


}

return trancode;

}

int CRC_4Test(int msgcode) /* CRC检验,如果接收到的信息码可以被产生码整除则返回1,否则返回0 */
{
int msg_len=0;
int gencode=(1<<4)+(1<<1)+1;
int gen_len=4;
int n=0;
int trancode=0;
int flag=1 ;

msg_len=cnt_bit(msgcode);
n=msg_len;

if(n>16) return -1;
else
{
int msgtemp=msgcode;
int result=msgtemp;
int gentemp=gencode<<(msg_len-gen_len-1);

int i=(msg_len-gen_len);

while(i>0)
{
if(cnt_bit(result)==n)
result=result^gentemp;

result=result<<1;
i--;

}


if(cnt_bit(result)==n)
trancode=(1<<(gen_len-1));
else
trancode=0;

result=result&((1<<(n-1))-1);
result=result>>(msg_len-gen_len);

trancode=trancode+result;


}

if(trancode!=0) flag=0;

return flag;
}

main()
{
int a=CRC_4(89);
int b=CRC_4Test(a);
printf("\n%d",b);

getch();
}

相关文档
最新文档