您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 金融资料 > 海明码和CRC校验的C语言实现
海明码和CRC校验的C语言实现1.海明码//codebyzxf2010.4.10#includestdio.h#includeconio.h#includemath.h//N代表待编码数据的上限位数#defineN100intHmLength(intk);//计算海明码校验位位数voidInCode(char*data,char*c,intk,intr);//计算海明码每个校验位的数值voidmain(){intk=0,r=0,dnum=0,cnum=0;chardata[N];charc[N];clrscr();printf(NowpleaseinputthedatayouwanttoIncode:);for(k=0;kN;k++)//循环输入待编码数据并记录数据长度,遇到非'1'非'0'输入结束输入{data[k]=getche();if(data[k]!='0'&&data[k]!='1'){break;}}printf(\n__________________________________________________________\n);r=HmLength(k);//求取校验位数printf(k=%dr=%dThelengthofHammingcode=%d\n,k,r,r+k);//输出海明码相关位数信息InCode(data,c,k,r);//计算海明码printf(TheHammingcodeis:);for(intj=1;jr+k+1;j++)//组合输出数据和校验码{if(j==(int)pow(2,cnum)){printf(%c,c[cnum]);cnum++;}else{printf(%c,data[dnum]);dnum++;}}getch();}/**@func:计算校验码*@param:data待编码数据,c校验码,k数据长度,r校验码位数*codebyzxf*/voidInCode(char*data,char*c,intk,intr){for(inti=0;ir;i++)//循环计算第i位校验位{intsum=0,dnum=0,cnum=0;for(intj=1;jr+k+1;j++)//计算海明码和矩阵第r-i列的乘积{if(j==(int)pow(2,cnum))//去掉矩阵的全零行{cnum++;//记录校验码循环位数}else{intx=0,y=0;x=pow(2,i);y=j%(x*2);x=y/x;//通过取余取商计算获取矩阵第r-i列第j行元素的值sum+=data[dnum]*x;//累加乘积dnum++;//记录数据的循环位数}}c[i]=sum%2==0?'0':'1';//通过结果的奇偶设置校验位的值}}/**@func:计算校验码的位数*@param:k数据长度*@return:校验码位数*codebyzxf*/intHmLength(intk){intr=0,flag=1;while(flag!=0)//循环到2^r-1=r+K时即得到校验码的位数{inttemp=0;temp=pow(2,r);temp=temp-1;flag=(temp-r-k0);r++;}returnr-1;}程序演示:计算1100计算1000001计算10101010101010101010101010101010101010CRC校验//codebyzxf2010.4.10#includestdio.h#includeconio.h#includestring.h//N代表待编码数据的上限位数#defineN100voidInputBinary(char*data);//输入二进制intDelZero(char*data);//去掉二进制字符串前面的零位intDiv(char*data,char*div);//进行一次模2除法voidmain(){chardatacpy[N];chardata[N];chardiv[N];charres[N];intreslen=0;clrscr();printf(nowpleaseinputthedata:);InputBinary(data);//输入Mprintf(\nnowpleaseinputthediv:);InputBinary(div);//输入除数DelZero(data);DelZero(div);//取得有效的M和除数strcpy(datacpy,data);//备份Mprintf(\nTheeffectivedatais:%s,data);printf(\nTheeffectivedivis:%s,div);for(inti=0;istrlen(div)-1;i++)//得到2^nM{data[strlen(data)]='0';}data[strlen(data)]='\0';res[reslen]='0';while(Div(data,div))//进行模2除法{inti=DelZero(data);res[reslen]='1';//记录商reslen++;if(strlen(data)=strlen(div))//记录零商{for(intj=0;ji;j++){res[reslen]='0';reslen++;}}}res[reslen]='\0';while(strlen(data)strlen(div)-1)//若FCS位数不足n则进行补零操作{for(inti=strlen(data);i0;i--){data[i]=data[i-1];}data[0]='0';}//输出结果printf(\n_______________________________________________________________);printf(\nThedivresultis:%s,res);printf(\nTheFCSis:%s,data);printf(\nThedatawishFCSis:%s%s,datacpy,data);getch();}/**@func:二进制输入*@param:data用于存储输入数据的字符串*codebyzxf*/voidInputBinary(char*data){for(inti=0;iN;i++)//循环输入待编码数据,遇到非'1'非'0'输入结束输入{data[i]=getche();if(data[i]!='0'&&data[i]!='1'){data[i]='\0';break;}}}/**@func:删除二进制串的起始'0'*@param:data待处理字符串*@return:返回删除零的个数-1*codebyzxf*/intDelZero(char*data){intres=-1;while(data[0]=='0')//如果data第一位为'0'继续前移字符串{for(inti=0;istrlen(data);i++)//前移字符串{data[i]=data[i+1];}res++;}returnres;}/**@func:进行一次模2除法*@param:data被除数,div除数*@return:返回0:被除数小于除数,返回1:成功进行了一次模2除法*codebyzxf*/intDiv(char*data,char*div){intres=0;if(strlen(data)strlen(div));//被除数小于除数不操作else{for(inti=0;istrlen(div);i++)//按位进行模2除法{data[i]=data[i]==div[i]?'0':'1';}res=1;}returnres;}程序演示:计算101001计算1101011011
本文标题:海明码和CRC校验的C语言实现
链接地址:https://www.777doc.com/doc-4191027 .html