CRC校验
zan
#技术#编程#Web开发
计算机网络的一次作业: 冗余码的生成
1.首先将k位信息码左移r位,得到长度为(k+r=n)的数
2.用得到的(k+n)位数,除以除数P(除数一般是一个生成多项式)得到余数R(n位,比P少一位)
3.R为所求冗余码
模2运算
模2运算进行加法不进位,实际上就是我们熟悉的异或运算。
#include<stdio.h>
#include<string.h>
int len(unsigned t)
{//获取数二进制的长度
int i=0;
while(t)
{
t>>=1;
i++;
}
return i;
}
unsigned int crc_work(unsigned mes,unsigned key)
{
int tl,cl,n;
n=len(key)-1;
mes<<=n;//左移n位,相当在待校验数据后补充n个0
cl=len(mes);
tl=cl-len(key);
key<<=tl;//在生成多项式低位填充0
while(len(mes)>n)
{
if((mes&0xfffffff)!=0)//当高位不是0时
{
mes=mes^key; //模2除实际是异或运算
tl=len(mes);
tl=cl-tl;
key>>=tl;
cl-=tl;
}
else
{
mes<<=1;
key>>=1;//使数据和生成多项式高位保持一直
}
}
return mes;//生成冗余码
}
int main()
{
unsigned int mes,key,res;
while(1)
{
printf("所有数据以十六进制输入!");
printf("请输入校验数据:\n");
scanf("%x",&mes);
printf("请输入生成多项式:\n");
scanf("%x",&key);
res=crc_work(mes,key);
printf("生成的校验码为0X%X\n",res);
}
// crc_work(0x59,0x19,4);
// crc_work(0x29,0x13,3);
return 0;
}