隻是最簡單的實作,可在其基礎上實作其他功能。
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();
}
}