CRC校验

发表于: 2013年04月13 00:00

计算机网络的一次作业。 ###冗余码的生成###

1.首先将k位信息码左移r位,得到长度为(k+r=n)的数

2.用得到的(k+n)位数,除以除数P(除数一般是一个生成多项式)得到余数R(n位,比P少一位)

3.R为所求冗余码

###模2运算###

模2运算进行加法不进位,实际上就是我们熟悉的异或运算。

:::c
/****************************************************** 
 Author:Fluyy                         
 HomePage:http://fluyy.net                
 Email:[email protected]
/ *****************************************************/
#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;   
}
© 2018 - fluyy - 粤ICP备17114935号