CRC4校验C语言源码实现

#include<stdio.h>   
#include <string.h>  

//该程序中二进制数用字符串表示,比如二进制的110就用"110"表示   
//该函数完成二进制数的异或   
//result保存异或的结果,s1和s2为两个二进制串   
char* strxor(char *result, const char *s1, const char *s2)  
{  
    int i=0;  
    while(s1[i] && s2[i]){  
        if(s1[i] != s2[i]){ //相异的时候为1   
            result[i] = '1';  
        }  
        else{   //相同则为0   
            result[i] = '0';  
        }  
        ++i;  
    }  
    result[i] = '\0';   //字符串结束   
    return result;  
}  
  
  
//将字符串左移一位   
//传入字符串本身,返回字符串本身   
char* strlmv(char *s)  
{  
    int i=0;  
    while(s[i]){  
        s[i] = s[i+1];  //前一个等于后一个   
        ++i;  
    }  
    return s;  
}  

//该函数完成模2除法   
//传入参数:被除数 除数 保存商的空间 保存余数的空间   
void strm2div(const char *strM, const char *strP, char *strQ, char *strR)  
{  
    int lM = strlen(strM);  //被除数的长度   
    int lP = strlen(strP);  //除数的长度   
    int L = lM+lP;  //被除数和除数的总长   
    int i;  //循环需要的   
  
    char *sM = new char[L+1];   //使用sM替换被除数,前lM个值为除数本身,后lP个值用0补上   
  
    for(i=0; i<L; ++i){  
        if(i<lM){    //前lM个值为除数本身   
            sM[i] = strM[i];  
        }  
        else{   //后lP个值用0补上   
            sM[i] = '0';  
        }  
    }  
    sM[i] = '\0';   //字符串结束   
  
    strncpy(strR, sM, lP);  //一开始余数照搬被除数   
    strR[lP] = '\0';    //字符串结束     
  
    for(i=0; i<lM; ++i){    
        if(strR[0]=='1'){   //如果余数最高位为1   
            strxor(strR, strR, strP);   //余数与除数做异或,异或后的值直接更新到余数   
            strQ[i] = '1';  //商1   
        }  
        else{   //如果余数高位为0    
            //这里应该是与lP个0做异或,因为和0做异或等于本身,因此略去   
            strQ[i] = '0';  //商0   
        }  
        strlmv(strR);   //把余数左移(最高位丢弃)   
        strR[lP-1] = sM[lP+i];  //在末尾补上对应的被除数位   
        strR[lP] = '\0';    //字符串结束   
    }  
    strR[lP-1] = '\0';      //余数只取前lP-1位(比除数P少一位)   
    strQ[i] = '\0';     //字符串结束   
    delete sM;  //回收空间 
}
  
  
//该函数输出CRC4的帧检验序列   
//传入待传送的数据strM 帧检验序列保存的空间   
//返回帧检验序列   
char *crc4(const char *strM, char *fcs)  
{  
    char *tmQ = new char[strlen(strM)+1];  
    strm2div(strM, "10011", tmQ, fcs);  //使用模2计算的方式求出FCS,带传送数据/10011再取余数   
    return fcs;  
}  
  

//CRC4校验演示   
void main()  
{  
    char inbuf[100], fcs[100]; //输入缓冲区 FCS缓冲区
	int i=0,j=0;
	printf("\n输入M:");
	scanf("%s",inbuf);
    while(inbuf[0]!='0' || inbuf[1]!='\0'){    
		printf("FCS:");
		puts(crc4(inbuf, fcs));
		printf("校验帧:");
		strcat(inbuf,fcs);
		puts(inbuf);
		crc4(inbuf, fcs);//检验
		for(i=0;i<100;i++){
			if(fcs[i]==1) j++;
		}
		printf("检验结果:"); printf("%d Error!\n",j);
		printf("输入M:");
		scanf("%s",inbuf);
    }  
}   

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汤梦飞123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值