海明码和CRC校验的C语言实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
海明码和CRC校验的C语言实现
1.海明码
//code by zxf 2010.4.10
#include
#include
#include
//N代表待编码数据的上限位数
#define N 100
int 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 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 { 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 { int sum=0,dnum=0,cnum=0; for(int j=1;j { 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 计算10101010101010101010101010101010101010 CRC校验 //code by zxf 2010.4.10 #include #include #include //N代表待编码数据的上限位数 #define N 100 void 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);//输入M printf("\nnow please input the div:"); InputBinary(div);//输入除数 DelZero(data); DelZero(div);//取得有效的M和除数 strcpy(datacpy,data);//备份M printf("\nThe effective data is:%s",data); printf("\nThe effective div is:%s",div); for(int i=0;i { 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 { res[reslen]='0'; reslen++; } } } res[reslen]='\0'; while(strlen(data) for(int i=strlen(data);i>0;i--) {