關於什麼是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++){ //換算插入位置是2的i次方-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+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 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; } }
全站熱搜