Article cover

CRC校验

Author avatar
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;	
}
Author avatar

关于作者

全栈开发者,技术爱好者,分享Web开发与编程心得

评论