CRC校验码C语言实现

时间与空间不可得兼。。我选择空间。。空间复杂度还是很低的。。

#include <stdio.h>
int shi(int n){
    return (n>0)?shi(n=n>>1)+1:0;
    }

void turnb(int n){
    if(n!=0){
        turnb(n>>1);
        printf("%d",n&1);
        }
}
int convertBinaryToDecimal(long long n)
{
    int decimalNumber = 0, i = 0, remainder;
    while (n>0)
    {
        remainder = n%10;
        n /= 10;
        decimalNumber += remainder*(1<<i);
        ++i;
    }
    return decimalNumber;
}

int mod(int n,int k){
    int lenn=shi(n),lenk=shi(k);
    n=n<<(lenk-1);
    k=k<<(lenn-1);
    int m=0;
    int midlen;
    int reg=n;
    for(;;){
        reg=reg^k;
        midlen=shi(reg);
        if(midlen<lenk)break;
        k=k>>(shi(k)-midlen);
    }
    return reg;
}            
        
int main(int argc, char** argv){
    long long n,k;
    int nl,kl;
    while(1){
        printf("输入要发送的数据:");
        scanf("%lld",&n);
        printf("输入CRC生成多项式:");
        scanf("%lld",&k);
        printf("CRC校验码为:");
        nl=convertBinaryToDecimal(n);
        kl=convertBinaryToDecimal(k);
        int r=mod(nl,kl);
        turnb(r);
        printf("\n最终的发送数据为:");
        nl=nl<<(shi(kl)-1);
        nl=nl^r;
        turnb(nl);
        printf("\n\n");
    }
    return 0;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值