最近在学习的时候偶然看到了海明码校验,就想着自己写一下。
先来抄一下百度~
汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。
海明码的算法这里就不多废话了,直接上代码(只是简易的实现一下,实现的方法有很多,大佬们不喜勿喷,)
public static void main(String[] args) {
String yuanma = "1011";//输入源码
int length = yuanma.length();
int n = getN(yuanma, length);
//定义H、S、P
String[] H = new String[length + n + 1];
String[] S = new String[length];
int[] P = new int[n];
for (int i = 0; i < length; i++) {
S[i] = yuanma.substring(i, i + 1);
}
//计算校验位
int j = 0;
int k = 0;
for (int i = 1; i < H.length; i++) {
if (i <= n) {
int e = (int) Math.pow(2, i - 1);
H[e] = "P" + i;
P[k] = e;
k = k + 1;
}
}
for (int i = 1; i < H.length; i++) {
if (H[i] == null) {
H[i] = S[S.length - j - 1];
j += 1;
}
}
System.out.print("H:");
for (int i = 1; i < H.length; i++)
System.out.print(H[i] + " ");
System.out.println("");
System.out.print("P:");
for (int i = 0; i < P.length; i++)
System.out.print(P[i] + " ");
System.out.println("");
//插入对应校验位
for (int r = 0; r < P.length; r++) {
List<String> list = new ArrayList<String>();
//跨几取几
int e = P[r];
//是否取/跨标识
int f = 0;
int m = e;
for (int t = e; t < H.length; t++) {
if (e > f && m == e) {
list.add(H[t]);
f = f + 1;
if (e == f)
m = 0;
} else {
f = 0;
m = m + 1;
}
}
// System.out.println(list);
int num = 0;
for (int i = 1; i < list.size(); i++) {
if (list.get(i).equals("1")) {
num = num + 1;
}
}
int qq = r + 1;
if (num % 2 != 0) {
System.out.println("P" + qq + "=" + 1);
} else {
System.out.println("P" + qq + "=" + 0);
}
}
}
/**
* 计算校验位个数
* @param hmm
* @param length
* @return
*/
public static int getN(String hmm, int length) {
int n = 1;
while (true) {
if (Math.pow(2, n) - n >= length + 1) {
break;
} else {
n += 1;
}
}
return n;
}
最后倒序输出H,替换P在H的位置即为最终结果