天天看點

用java實作的海明碼及驗證出錯位

隻是最簡單的實作,可在其基礎上實作其他功能。

import java.util.Scanner;

public class Ham {

 Scanner enter=new Scanner(System.in);

 String s_data;           //輸入的字元串類型的資料

 int dlength;             //輸入資料的長度

 int[] data;              //将輸入的資料轉換成整型資料

 int hlength;            //海明碼長度

 int[] ham;              //海明碼

 int plength;            //校驗位長度

 int[] p;                //校驗位

 int[] c;                //驗證出錯位數的數組

 void input(){

  System.out.println("輸入資料:");

  String s_data=enter.nextLine();

  dlength=s_data.length();

  data=new int[dlength];

  for(int i=0;i<dlength;i++){

   data[i]=Integer.parseInt(s_data.substring(i, i+1));

//System.out.print(data[i]);

  }

  generateHam();

 }

 void generateHam(){

  int i=1;

  int label=1; //指向海明碼的校驗位

  int k=data.length-1;    //指向資料位

  while(Math.pow(2, i)<dlength+i+1){

   i++;

  }

  plength=i;  //校驗位位數

p=new int[plength];

c=new int[plength];

//System.out.println("plength "+plength);

  hlength=dlength+plength;

  ham=new int[hlength];

  for(int j=0;j<hlength;j++){

   if(j+1==label){

    ham[j]=0;

    label*=2;

   }else{

    ham[j]=data[k--];

   }

  }

  int r; //指向校驗位位數

  int sum=0;

  for(i=hlength;i>0;i--){

   for(r=plength-1;r>=0;r--){

    if(i!=Math.pow(2, r)&&sum+Math.pow(2, r)<=i){

     ham[(int)Math.pow(2, r)-1]=(ham[(int)Math.pow(2, r)-1]+ham[i-1])%2;

//p[r]=(p[r]+ham[i-1])%2;

     sum=sum+(int)Math.pow(2, r);

    }else{ 

     if(i==Math.pow(2, r)){

      break;

     }

    }

   }

   sum=0;

  }

  System.out.print("生成海明碼為:");

  for(int m=0;m<hlength;m++){

   System.out.print(ham[m]);

  }

  System.out.println();

 }

 void group(){

  int i;

  int r; //指向校驗位位數

  int sum=0;

  for(i=hlength;i>0;i--){

   for(r=plength-1;r>=0;r--){

    if(i!=Math.pow(2, r)&&sum+Math.pow(2, r)<=i){

     c[r]=(c[r]+ham[i-1])%2;

//p[r]=(p[r]+ham[i-1])%2;

     sum=sum+(int)Math.pow(2, r);

    }else{ 

     if(i==Math.pow(2, r)){

      c[r]=(c[r]+ham[i-1])%2;

      break;

     }

    }

   }

   sum=0;

 }

 }

    void check(){

      int sum=0;

      System.out.print("提示處錯位:");

      for(int i=c.length-1;i>=0;i--){  //輸出組資訊

       System.out.print(c[i]);

      }

      System.out.println();

      for(int i=0;i<c.length;i++){

       sum=sum+(int)(c[i]*Math.pow(2, i)); //求出第幾位出錯

      }

  //System.out.println(sum);

      if(sum==0){

       System.out.println("輸入正确!");

      }else{

       System.out.println("輸入錯誤,第"+sum+"位出錯");

      }

     }

  void inputError(){

      System.out.print("請輸入海明碼:");

      s_data=enter.nextLine();

      for(int i=0;i<ham.length;i++){

       ham[i]=Integer.parseInt(s_data.substring(i,i+1));

      }

      System.out.print("輸入的海明碼為:");

      for(int i=0;i<ham.length;i++){

       System.out.print(ham[i]);

      }

      System.out.println();

      group();

      check();

     }

 public static void main(String[] args){

  Ham ham=new Ham();

  ham.input();

  ham.inputError();

 }

}