二进制CRC校验码生成程序

本文介绍了一个用于生成二进制CRC序列的C语言程序。该程序通过输入源序列和检验码来计算并输出CRC校验序列。文章包含了完整的源代码实现,并详细解释了模2除法的过程。

 

 

/**二进制CRC序列生成程序*/
#include<stdio.h>
#include<string.h>
#define LEN_DIVIDEND 30
#define LEN_DIVISOR 30
#define LEN_SEQUENCE LEN_DIVIDEND+LEN_DIVISOR
void CRC(char*,char*,char*);
void MOD2_div(char*,char*,char*);
void move(char *,int);
int main(){
    char dividend[LEN_DIVIDEND];//被除数
    char divisor[LEN_DIVISOR];//除数
    char sequence[LEN_SEQUENCE];//CRC序列

    freopen("in.txt","r",stdin);
    printf("请输入源序列:");
    scanf("%s",dividend);printf("%s\n",dividend);

    printf("请输入检验码:");
    scanf("%s",divisor);printf("%s\n",divisor);

    CRC(dividend,divisor,sequence);
    return 0;
}
void move(char *FCS,int len){
    int i;
    char c=FCS[0];
    for(i=0;i<len-1;i++){
        FCS[i]=FCS[i+1];
    }
    FCS[i]=c;
}
void MOD2_div(char *dividend,char *divisor,char *FCS){
    int len_dividend=strlen(dividend);
    int len_divisor=strlen(divisor);
    int len_FCS=len_divisor-1;
    int i,j;
    for(i=0;i<len_divisor;i++)
        FCS[i]=dividend[i];
    FCS[len_divisor]=0;
    printf("dividend=%s\n",dividend);
    printf("divisor=%s\n",divisor);
    printf("------------\n");
    for(i=len_divisor;i<len_dividend+1;i++){
        if(FCS[0]=='0'){
            move(FCS,len_divisor);
            FCS[len_divisor-1]=dividend[i];
            continue;
        }
        for(j=0;j<len_divisor;j++){
            FCS[j]=(dividend[i-len_divisor+j]+divisor[j]-96)%2+48;
        }
        move(FCS,len_divisor);FCS[len_divisor-1]=dividend[i];
        //FCS[j-1]=dividend[i];
        printf("%s\n",FCS);
    }
    printf("------------\n");

    FCS[len_divisor-1]=0;
}
void CRC(char *dividend,char *divisor,char *sequence){
    char FCS[LEN_DIVISOR];
    int len_FCS=strlen(divisor)-1;
    int i;
    strcpy(sequence,dividend);
    for(i=0;i<len_FCS;i++){
        strcat(dividend,"0");
    }
    MOD2_div(dividend,divisor,FCS);
    strcat(sequence,FCS);
    printf("FCS=%s\n",FCS);
    printf("sequence=%s\n",sequence);
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值