Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1255582
  • 博文数量: 404
  • 博客积分: 10011
  • 博客等级: 上将
  • 技术积分: 5382
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-03 16:29
文章存档

2010年(40)

2009年(140)

2008年(224)

我的朋友

分类: LINUX

2009-04-22 09:21:35

 
/////////////////////////////////////////////////////////////////
//Discription:对数据生成CRC校验码;
//Version:    1.0   2007-12.11
//Modify:    no
//实现思想:
//        1:定义生成表达式:G(x)=...(r阶)
//        2:要得到校验码的帧:M(x)=...
//        3:将帧左移r位;
//        4:进行异或运算;
///////////////////////////////////////////////////////////////////

#include 
<stdio.h>

/*
功能:获取有效的二进制位数;
参数:nData[in]:    要获取二进制位数的数据;
返回:成功返回数据的二进制位数。
说明:如果该数为0,则返回的二进制位数为0;
修改记录:无
------------------------------------------------------------------
*/

unsigned 
int GetBits(unsigned int nData)
{
    unsigned 
int nNum=0;
    
while (nData!=0)
    
{
        nData
=nData>>1;
        nNum
++;
    }

    
return nNum;
}


/*
功能:根据指定多项式得到指定数据的CRC校验码
参数:nData[in]:要得到校验码的数据;
      nPoly[in]:预先设定的生成多项式;
返回值:成功返回得到的CRC校验码;
-----------------------------------------------------------------
*/

unsigned 
int GetCRC(unsigned int nData,unsigned int nPoly)
{
    unsigned 
int nRank=GetBits(nPoly)-1;//得到多项式的阶.固定值。
    unsigned int nbits;
    unsigned 
int nFront;
    unsigned 
int nBehind;

    unsigned 
int nMulData = nData<<nRank;//得到移动之后的数据;
    nbits = GetBits(nMulData);//得到数据的位数,会根据数据变动而变化。


    
/*当要分析的数据二进制位数小于(nRank+1)说明得到最终的校验码*/
    
while(nbits>nRank)
    
{
        nFront 
= nMulData>>(nbits-nRank-1); //初始参与计算的数据。此后该变量都是代表余数;

        nBehind 
=nMulData^(nFront<<(nbits-nRank-1));//得到后半部分待分析的数据;

    
//    printf("nMulData=%d,nFront=%d,nBehind=%d,nbits=%d ",nMulData,nFront,nBehind,nbits);
        nFront = nFront^nPoly;//得到余数;

        nMulData 
=(nFront<<(nbits-nRank-1))^nBehind; 
    
//    printf("余数=%d,新nMulData=%d ",nFront,nMulData);

        nbits 
= GetBits(nMulData);
    }

    
return nMulData;
}


int main(void)
{
    printf(
"GetBits(216)=%d ",GetBits(216));
    printf(
"GetCRC(216,4449)=%d ",GetCRC(216,69665));

    
return 0;
}


阅读(706) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~