CRC校验码 C语言实现 一种方法

 

模2除(按位除)

模2除做法与算术除法类似,但每一位除(减)的结果不影响其它位,即不向上一位借位。所以实际上就是异或。然后再移位移位做下一位的模2减。步骤如下:

a、用除数对被除数最高几位做模2减,没有借位。

b、除数右移一位,若余数最高位为1,商为1,并对余数做模2减。若余数最高位为0,商为0,除数继续右移一位。

c、一直做到余数的位数小于除数时,该余数就是最终余数。

【例】1111000除以1101: (先用动手多算几个 模2除法对 程序设计有很大好处)

1011———商

————

1111000-----被除数

1101———— 除数

————

010000

1101

————

01010

1101

————

111————余数

实现效果预览:

 

 

C语言实现:

 

 

 /********************************************************************* 

功能:对数据进行 CRC校验 输出 校验码
算法: 模二除法, 除法的一般原理,补0思想
时间: 2011 - 08 -09
地点: 中科大苏州研究院
作者: 李开国 
******************************************************************** */
#include 
< stdio.h >
void  CRC_check( long  MD, long  GD);
int  main()
{
    
long  MD;  //
     long  GD;  //
     int  tmp = 10 ;
    printf(
" \n\n------CRC校验码-------数据以16进制输入 " ); 
 
while (tmp --
 {
     

        printf(
" \nPlease input 校验数据:\n>> " );
        scanf(
" %x " , & MD);
        printf(
" Please input 多项式:\n>> " );
        scanf(
" %x " , & GD);
        CRC_check(MD,GD);
        printf(
" \n按任意键继续》》》》 " );
     
 }     
    

}
void  CRC_check( long  MD1, long  GD1)
{
    
long  MD  =  MD1 ;   //  需要校验的数据 
     long  GD  =  GD1;      // 随机生成的多项式 
     long  tmp;             // 临时变量保存多个移位,或恢复原值信息 
     int  count_MD;         // 校验数据的 位数 
     int  count_GD;         // 多项式的 位数 
     int  count;             // 两者位数差 
      long  tst0  =   1 ;         // 判断余数最高位是否为 0  

    tmp 
=  MD;   // 数 MD 有多少位 
     for (count_MD  =   0  ; MD  !=   0  ; count_MD ++ )
        MD 
>>=   1 ;    
    MD 
=  tmp;
    tmp 
=  GD;  // 数 GD有多少位 
     for (count_GD  =   0  ; GD  !=    0  ; count_GD ++ )
        GD 
>>=   1 ;
    GD 
=  tmp ;
    
// 构造CRC码序列  
     for (tmp  =   1  ; tmp  <  count_GD ; tmp  ++ )
            MD 
<<=   1 ;
            
    count 
=  count_MD   -   1 ;
    
// 将GD 与 MD 构造等长,低位用0填充 
    tmp  =  count;
    
while (count -- )
    {
        GD 
<<=   1  ;
    }
    count 
=  tmp;
    
// tst0 和 MD 求与 运算,确定MD最高位是否为 1,确定是否应该求模 
    tmp  =  count_GD  +  count_MD  - 1  ;
    
while ( -- tmp)
        tst0 
<<=   1 ;
    
// MD == 11 0101 1011 0000 ,模二除法的实现 
     for ( ; count  >=   0   ; count -- )
    {
    
//     printf("tst0&MD==%x,   tst0==%x tst0&MD=%d \n\n",tst0&MD,tst0,(tst0==tst0&MD));

        
if (tst0  ==  (tst0 & MD))
        {
            MD 
^=  GD ;  //  少量修改可以实现 商的计数 
        } 
        tst0 
>>=   1
        GD 
>>=   1 ;
        
    }
    printf(
" CRC校验码:0x%X " ,MD);     // 输出CRC校验码    
    
    
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值