汉明编码简单c语言,计算机网络中Hamming(哈明码)的c语言实现

直接贴代码了

//============================================================================

// Name : Hamming.cpp

// Author : wzw

// Version :

// Copyright : Your copyright notice

// Description : Hello World in C++, Ansi-style

//============================================================================

#include

#include

#include

int isRightParity(int,int[]);

void getColumn(int,int,int,int[]);

void getParity(int[],int,int,int[],int[]);//得到数据与校验码组合码

void getCodedMessage(int[],int[],int,int[]);

int isPowerOfTwo(int);

int getParityBit(int);

void getNextParityCode(int,int,int[]);

int main(){

int data_bit; //数据位长

printf("Input The Bits Of Data:/n");

scanf("%d",&data_bit);

int data[data_bit];

for (int i=0;i

printf("Input The %dth Bit/n",i+1);

int temp;

temp=(int)getche()-48;

if((temp==0)||(temp==1)){ //确保输入数据时0或1

data[i]=temp;

printf("/n");

}

else{

printf("/nInput Must Be 0 Or 1/n");

i--;

}

}

printf("The Data To Be Coded Is: ");//显示输入的待传输数据

for(int i=0;i

printf("%d",data[i]);

}

int parity_bit; //校验码位长matrix column;matrix row is parity+data_bit;

parity_bit=getParityBit(data_bit); //根据数据位长选择最短的检验码,返回位长

printf("/nChoose Bits Of Parity Is: %d /n",parity_bit);

int parity_code[parity_bit]; //校验码

int coded_message[parity_bit+data_bit]; //数据和校验码融合之后的数据

getParity(data,data_bit,parity_bit,parity_code,coded_message);

printf("Parity Is: ");

for(int i=0;i

printf("%d",parity_code[i]);

}

printf("/nCoded Message Is: ");

for(int i=0;i

printf("%d",coded_message[i]);

}

printf("/n/nPress Any Key Exit...");

getch();

}

void getColumn(int index,int data_bit,int parity_bit,int column[]){

for(int i=0;i

int parity_row[parity_bit];

getNextParityCode(parity_bit,i,parity_row);

column[i]=parity_row[index];

}

}

void getParity(int data[],int data_bit,int parity_bit,int parity_code[],int coded_message[]){ //计算校验码P

int flag[parity_bit];

int column[data_bit+parity_bit];//矩阵一列

for(int m=0;m

getNextParityCode(parity_bit,m,parity_code);

getCodedMessage(data,parity_code,(parity_bit+data_bit),coded_message);

for(int i=0;i

flag[i]=0;

}

for(int i=0;i

getColumn(i,data_bit,parity_bit,column);

int matrix_product=0;//乘积

for(int j=0;j

matrix_product=matrix_product+coded_message[j]*column[j];

}

if(matrix_product%2==0){

flag[i]=1;

continue;

}

else{

flag[i]=0;

break;

}

}

if(isRightParity(parity_bit,flag)==1){

break;

}

else{

continue;

}

}

}

int isRightParity(int length,int flag[]){

int temp=1;

for(int i=0;i

temp=temp*flag[i];

}

if(temp==1){

return 1;

}

else{

return 0;

}

}

void getCodedMessage(int data[],int parity_code[],int length,int coded_message[]){

int index_data,index_parity;

index_data=index_parity=0;

for(int i=0;i

if(isPowerOfTwo(i+1)==1){

coded_message[i]=parity_code[index_parity];

index_parity++;

}

else{

coded_message[i]=data[index_data];

index_data++;

}

}

}

int isPowerOfTwo(int num){//num is power幂 of 2 or not

int ispoweroftwo;

int i=0;

while(1){

int pow2i=(int)pow(2,(double)i);

if(num

ispoweroftwo=0;

break;

}

else if(num==pow2i){

ispoweroftwo=1;

break;

}

else if(num>pow2i){

i++;

}

}

return ispoweroftwo;

}

void getNextParityCode(int parity_bit,int index,int parity_code[]){//change index+1 to BCD

int temp=index+1;

for(int i=0;i

parity_code[parity_bit-i-1]=temp%2;

temp=temp/2;

}

}

int getParityBit(int data_bit){//get least bit of parity

int paritybit=0;

int power;

while(1){

paritybit++;

power=(int)pow(2,(double)paritybit)-1;

if((paritybit+data_bit)<=power){

break;

}

}

return paritybit;

}

0818b9ca8b590ca3270a3433284dd417.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值