關於什麼是Hammiong Code(漢明碼)

是一種資料傳輸過程中的Error Correcting

收到資料解譯的部分

import java.util.Scanner;

public class MainClass {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("請輸入資料的長度:");
        int inputNum = sc.nextInt();
        int hammingCodeLength = hammingCodeLength(inputNum);
        System.out.print("請輸入資料(二進制)");
        String inputData = sc.nextLine();
        do{
            inputData = sc.nextLine();
        }
        //確認資料長度
        while (inputDataCheck(inputNum, inputData));


        String[] arr = new String[2];
        arr = changeToBinary(inputData, arr, hammingCodeLength);
        //印出陣列
        for (String a : arr) {
            System.out.print(a + " ");
        }
        System.out.println();

        //判斷是否有位元傳送錯誤,結果是否為0000
        int[] judge = parityCode(arr, hammingCodeLength);
        String ans = "";
        for(int i =0; i<judge.length; i++){
            ans += judge[i];
        }
        int lastAns = Integer.parseInt(ans);
        if(lastAns == 0000){
            System.out.println("傳送位元皆完整");
        }else{
            System.out.println("資料傳送有誤,錯誤位元位於:" + lastAns + "(" + Integer.valueOf(ans,2)+"位元)");
        }
    }

    //計算漢明碼長度
    public static int hammingCodeLength(int inputNum) {
        //公式:2^k ≥ N+k+1,N:資料長度,k: Hamming code長度
        int result = 0;
        int tmp = inputNum + 1;
        while (tmp > 2) {
            tmp /= 2;
            result++;
        }
        return (result > 3 ? result : 4);
    }

    //確認輸入長度是否正確
    public static boolean inputDataCheck(int inputLength, String inputData) {
        if (inputData.length() == inputLength) {
            return false;
        } else {
            System.out.println("輸入資料長度有誤!" + "\n請重新輸入:");
            return true;
        }
    }

    public static String[] doubleArr(String[] arr) {
        String[] newArr = new String[arr.length + 1];
        System.arraycopy(arr, 0, newArr, 0, arr.length);
        return newArr;
    }

    //將資料中為1的位置,轉成二進制,放入陣列中
    public static String[] changeToBinary(String data, String[] arr, int binaryLength) {
        int count = 0;
        for (int i = 0; i < data.length(); i++) {
            if (data.charAt(i) == '1') {
                if (count == arr.length) {
                    arr = doubleArr(arr);
                }
                StringBuffer input = new StringBuffer();
                input.append(Integer.toBinaryString(i + 1));
                //若長度不足,前方補0
                while (input.length() < binaryLength) {
                    input.insert(0, "0");
                }
                arr[count] = input.toString();
                count++;
            }
        }
        return arr;
    }

    //創建XOR結果的陣列
    public static int[] parityCode(String[] binary, int length) {
        int[] judge = new int[length];
        for (int i = 0; i < length; i++) {
            int count = 0;
            for (int n = 0; n < binary.length; n++) {
                if (binary[n].charAt(i) == '1') {
                    count++;
                }
            }
            if (count % 2 != 0) {
                judge[i] = 1;
            } else {
                judge[i] = 0;
            }
        }
        return judge;
    }


}

 

加入漢明碼的部分

public static void hammingCoding(){
    Scanner sc = new Scanner(System.in);
    System.out.print("請輸入資料(二進制)");
    String inputNum = sc.nextLine();
    int hammingCodeLength = hammingCodeLength(inputNum.length());
    StringBuffer tmp = new StringBuffer();
    tmp.append(inputNum);
    //先將要加入漢明碼的位置放入0
    for(int i =0; i<hammingCodeLength; i++){
        tmp.insert(twoDeZiFun(i)-1,0);
    }
    //算出漢明碼
    String tmp2 = tmp.toString();
    String[] arr = new String[2];
    arr = changeToBinary(tmp2,arr,hammingCodeLength);
    String[] judge = parityCodeReStr(arr,hammingCodeLength);
    //將漢明碼放入資料中
    for(int i = hammingCodeLength-1; i>=0; i--){
        tmp.replace(twoDeZiFun(i)-1,twoDeZiFun(i),judge[i]);
    }
    //印出加碼後的資料
    System.out.println("加入漢明碼的資料為:" + tmp);

}
//計算漢明碼長度
public static int hammingCodeLength(int inputNum) {
    //公式:2^k ≥ N+k+1,N:資料長度,k: Hamming code長度
    int result = 0;
    int tmp = inputNum + 1;
    while (tmp > 2) {
        tmp /= 2;
        result++;
    }
    return (result > 3 ? result : 4);
}

//確認輸入長度是否正確
public static boolean inputDataCheck(int inputLength, String inputData) {
    if (inputData.length() == inputLength) {
        return false;
    } else {
        System.out.println("輸入資料長度有誤!" + "\n請重新輸入:");
        return true;
    }
}

public static String[] doubleArr(String[] arr) {
    String[] newArr = new String[arr.length + 1];
    System.arraycopy(arr, 0, newArr, 0, arr.length);
    return newArr;
}

//將資料中為1的位置,轉成二進制,放入陣列中
public static String[] changeToBinary(String data, String[] arr, int binaryLength) {
    int count = 0;
    for (int i = 0; i < data.length(); i++) {
        if (data.charAt(i) == '1') {
            if (count == arr.length) {
                arr = doubleArr(arr);
            }
            StringBuffer input = new StringBuffer();
            input.append(Integer.toBinaryString(i + 1));
            //若長度不足,前方補0
            while (input.length() < binaryLength) {
                input.insert(0, "0");
            }
            arr[count] = input.toString();
            count++;
        }
    }
    return arr;
}

//創建XOR結果的陣列
public static String[] parityCodeReStr(String[] binary, int length) {
    String[] judge = new String[length];
    for (int i = 0; i < length; i++) {
        int count = 0;
        for (int n = 0; n < binary.length; n++) {
            if (binary[n].charAt(i) == '1') {
                count++;
            }
        }
        if (count % 2 != 0) {
            judge[i] = "1";
        } else {
            judge[i] = "0";
        }
    }
    return judge;
}

//創建XOR結果的陣列
public static int[] parityCode(String[] binary, int length) {
    int[] judge = new int[length];
    for (int i = 0; i < length; i++) {
        int count = 0;
        for (int n = 0; n < binary.length; n++) {
            if (binary[n].charAt(i) == '1') {
                count++;
            }
        }
        if (count % 2 != 0) {
            judge[i] = 1;
        } else {
            judge[i] = 0;
        }
    }
    return judge;
}

//二的次方
public static int twoDeZiFun(int ziFun){
    int result = 1;
    for(int i = 1; i<=ziFun; i++ ){
        result *= 2;
    }
    return result;
}

 

 

最後合併一起:

import java.util.Scanner;

public class HammingCode {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("請選擇項目: 1.加入漢明碼  2.解譯漢明碼  3.結束");
        int input = sc.nextInt();
        switch (input){
            case 1:
                hammingCoding();
                break;
            case 2:
                interpretation();
                break;
            case 3:
                break;
        }
    }

    //加入漢明碼
    public static void hammingCoding(){
        Scanner sc = new Scanner(System.in);
        System.out.print("請輸入資料(二進制)");
        String inputNum = sc.nextLine();
        int hammingCodeLength = hammingCodeLength(inputNum.length());
        //創建一個臨時字串,先將資料放入
        StringBuffer tmp = new StringBuffer();
        tmp.append(inputNum);
        //先將要加入漢明碼的位置放入0
        for(int i =0; i<hammingCodeLength; i++){
            //換算插入位置是2i次方-1  實際(1.2.4.8) 程式index(0.1.3.7)
            tmp.insert(twoDeZiFun(i)-1,0);
        }
        //算出漢明碼
        String tmp2 = tmp.toString(); 
        String[] arr = new String[2]; //建立要放二進制代碼的陣列
        arr = changeToBinary(tmp2,arr,hammingCodeLength); 
        String[] judge = parityCodeReStr(arr,hammingCodeLength); //算出漢明碼
        //將漢明碼放入資料中
        for(int i = hammingCodeLength-1; i>=0; i--){
            tmp.replace(twoDeZiFun(i)-1,twoDeZiFun(i),judge[i]);
        }
        //印出加碼後的資料
        System.out.println("加入漢明碼的資料為:" + tmp);

    }

    //解譯漢明碼
    public static void interpretation(){
        Scanner sc = new Scanner(System.in);
        System.out.print("請輸入資料的長度:");
        int inputNum = sc.nextInt();
        int hammingCodeLength = hammingCodeLength(inputNum);
        System.out.print("請輸入資料(二進制)");
        String inputData = sc.nextLine();
        do{
            inputData = sc.nextLine();
        }
        //確認資料長度
        while (inputDataCheck(inputNum, inputData));


        String[] arr = new String[2];
        arr = changeToBinary(inputData, arr, hammingCodeLength);
        //印出陣列
//        for (String a : arr) {
//            System.out.print(a + " ");
//        }
//        System.out.println();
        //判斷是否有誤,結果是否為0000
        int[] judge = parityCode(arr, hammingCodeLength);
        String ans = "";
        for(int i =0; i<judge.length; i++){
            ans += judge[i];
        }
        int lastAns = Integer.parseInt(ans);
        if(lastAns == 0000){
            System.out.println("傳送位元皆完整");
        }else{
            System.out.println("資料傳送有誤,錯誤位元位於:" + lastAns + "(" + Integer.valueOf(ans,2)+"位元)");
        }
    }

    //計算漢明碼長度
    public static int hammingCodeLength(int inputNum) {
        //公式:2^k ≥ N+k+1N:資料長度,k: Hamming code長度
        int result = 0;
        int tmp = inputNum + 1;
        while (tmp > 2) {
            tmp /= 2;
            result++;
        }
        return (result > 3 ? result : 4);
    }

    //確認輸入長度是否正確
    public static boolean inputDataCheck(int inputLength, String inputData) {
        if (inputData.length() == inputLength) {
            return false;
        } else {
            System.out.println("輸入資料長度有誤!" + "\n請重新輸入:");
            return true;
        }
    }

    public static String[] doubleArr(String[] arr) {
        String[] newArr = new String[arr.length + 1];
        System.arraycopy(arr, 0, newArr, 0, arr.length);
        return newArr;
    }

    //將資料中為1的位置,轉成二進制,放入陣列中
    public static String[] changeToBinary(String data, String[] arr, int hammingLength) {
        int count = 0;
        for (int i = 0; i < data.length(); i++) {
            if (data.charAt(i) == '1') {
                if (count == arr.length) {
                    arr = doubleArr(arr);
                }
                StringBuffer input = new StringBuffer();
                input.append(Integer.toBinaryString(i + 1));
                //若長度不足,前方補0
                while (input.length() < hammingLength) {
                    input.insert(0, "0");
                }
                arr[count] = input.toString();
                count++;
            }
        }
        return arr;
    }

    //創建XOR結果的陣列
    public static String[] parityCodeReStr(String[] binary, int length) {
        String[] judge = new String[length];
        for (int i = 0; i < length; i++) {
            int count = 0;
            for (int n = 0; n < binary.length; n++) {
                if (binary[n].charAt(i) == '1') {
                    count++;
                }
            }
            if (count % 2 != 0) {
                judge[i] = "1";
            } else {
                judge[i] = "0";
            }
        }
        return judge;
    }

    //創建XOR結果的陣列
    public static int[] parityCode(String[] binary, int length) {
        int[] judge = new int[length];
        for (int i = 0; i < length; i++) {
            int count = 0;
            for (int n = 0; n < binary.length; n++) {
                if (binary[n].charAt(i) == '1') {
                    count++;
                }
            }
            if (count % 2 != 0) {
                judge[i] = 1;
            } else {
                judge[i] = 0;
            }
        }
        return judge;
    }

    //二的次方
    public static int twoDeZiFun(int ziFun){
        int result = 1;
        for(int i = 1; i<=ziFun; i++ ){
            result *= 2;
        }
        return result;
    }
}

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Lillian 的頭像
    Lillian

    安安的code日記

    Lillian 發表在 痞客邦 留言(0) 人氣()