当前位置:文档之家› 海明码和CRC校验的C语言实现

海明码和CRC校验的C语言实现

海明码和CRC校验的C语言实现1.海明码//code by zxf 2010.4.10#include <stdio.h>#include <conio.h>#include <math.h>//N代表待编码数据的上限位数#define N 100int HmLength(int k);//计算海明码校验位位数void InCode(char *data,char *c,int k,int r);//计算海明码每个校验位的数值void main(){int k=0,r=0,dnum=0,cnum=0;char data[N];char c[N];clrscr();printf("Now please input the data you want to Incode:");for(k=0;k<N;k++)//循环输入待编码数据并记录数据长度,遇到非'1'非'0'输入结束输入{data[k]=getche();if(data[k]!='0'&&data[k]!='1'){break;}}printf("\n__________________________________________________________\n");r=HmLength(k);//求取校验位数printf("k=%d r=%d The length of Hamming code=%d\n",k,r,r+k);//输出海明码相关位数信息InCode(data,c,k,r);//计算海明码printf("The Hamming code is:");for(int j=1;j<r+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 校验码位数*code by zxf*/void InCode(char *data,char *c,int k,int r){for(int i=0;i<r;i++)//循环计算第i位校验位{int sum=0,dnum=0,cnum=0;for(int j=1;j<r+k+1;j++)//计算海明码和矩阵第r-i列的乘积{if(j==(int)pow(2,cnum))//去掉矩阵的全零行{cnum++;//记录校验码循环位数}else{int x=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: 校验码位数*code by zxf*/int HmLength(int k){int r=0,flag=1;while (flag!=0)//循环到2^r-1>=r+K时即得到校验码的位数{int temp=0;temp=pow(2,r);temp=temp-1;flag=(temp-r-k<0);r++;}return r-1;}程序演示:计算1100计算1000001计算10101010101010101010101010101010101010CRC校验//code by zxf 2010.4.10#include <stdio.h>#include <conio.h>#include <string.h>//N代表待编码数据的上限位数#define N 100void InputBinary(char *data);//输入二进制int DelZero(char *data);//去掉二进制字符串前面的零位int Div(char *data,char *div);//进行一次模2除法void main(){char datacpy[N];char data[N];char div[N];char res[N];int reslen=0;clrscr();printf("now please input the data:");InputBinary(data);//输入Mprintf("\nnow please input the div:");InputBinary(div);//输入除数DelZero(data);DelZero(div);//取得有效的M和除数strcpy(datacpy,data);//备份Mprintf("\nThe effective data is:%s",data);printf("\nThe effective div is:%s",div);for(int i=0;i<strlen(div)-1;i++)//得到2^nM{data[strlen(data)]='0';}data[strlen(data)]='\0';res[reslen]='0';while (Div(data,div))//进行模2除法{int i=DelZero(data);res[reslen]='1';//记录商reslen++;if(strlen(data)>=strlen(div))//记录零商{for(int j=0;j<i;j++){res[reslen]='0';reslen++;}}}res[reslen]='\0';while(strlen(data)<strlen(div)-1)//若FCS位数不足n则进行补零操作{for(int i=strlen(data);i>0;i--){data[i]=data[i-1];}data[0]='0';}//输出结果printf("\n_______________________________________________________________");printf("\nThe div result is:%s",res);printf("\nThe FCS is:%s",data);printf("\nThe data wish FCS is:%s%s",datacpy,data);getch();}/**@func:二进制输入*@param:data 用于存储输入数据的字符串*code by zxf*/void InputBinary(char *data){for(int i=0;i<N;i++)//循环输入待编码数据,遇到非'1'非'0'输入结束输入{data[i]=getche();if(data[i]!='0'&&data[i]!='1'){data[i]='\0';break;}}}/**@func:删除二进制串的起始'0'*@param:data 待处理字符串*@return:返回删除零的个数-1*code by zxf*/int DelZero(char *data){int res=-1;while(data[0]=='0')//如果data第一位为'0'继续前移字符串{for(int i=0;i<strlen(data);i++)//前移字符串{data[i]=data[i+1];}res++;}return res;}/**@func:进行一次模2除法*@param:data 被除数, div 除数*@return:返回0:被除数小于除数,返回1:成功进行了一次模2除法*code by zxf*/int Div(char *data,char *div){int res=0;if(strlen(data)<strlen(div)) ;//被除数小于除数不操作else{for(int i=0;i<strlen(div);i++)//按位进行模2除法{data[i]=data[i]==div[i]?'0':'1';}res=1;}return res;}程序演示:计算101001计算1101011011。

相关主题