我们用面向对象的思想把校验码方式分成一个一个的类,为了提高代码重用性,就先构建一个所有校验码类型的超类,就叫他CheckCode,也就是校验码的意思。
public abstract class CheckCode {
private final static double p = 0.02;
public abstract boolean[] encode(boolean[] codes);
public abstract boolean[] decode(boolean[] codes);
public static void transfer(boolean[] codes) {
for (int i = 0; i < codes.length; i++) {
if (Math.random() < p) {
codes[i] =! codes[i];
}
}
}
public static boolean[] toCodes(String str) {
boolean[] codes = new boolean[str.length()];
for (int i = 0; i < codes.length; i++) {
codes[i] = !(str.charAt(i) == '0');
}
return codes;
}
public static String codesString(boolean[] codes) {
StringBuilder sb = new StringBuilder();
for (boolean b : codes) {
sb.append(b ? '1' : '0');
}
return sb.toString();
}
}
这是一个抽象类,用来编码和解码的encode和decode方法是抽象的,因为不同的校验码必然编码和解码方式是不一样的,这里留给CheckCode的各个子类去多态地实现。
一、奇偶校验码public class ParityCode extends CheckCode{
private final boolean way;
@Override
public boolean[] encode(boolean[] codes) {
boolean[] encodes = new boolean[codes.length + 1];
encodes[0] = way;
System.arraycopy(codes, 0, encodes, 1, codes.length);
for (boolean code : codes) {
encodes[0] ^= code;
}
return encodes;
}
@Override
public boolean[] decode(boolean[] codes) {
boolean flag = way;
for (boolean code : codes) {
flag ^= code;
}
if (flag) {
System.err.println("存在码元出错");
return codes;
}
boolean[] encodes = new boolean[codes.length - 1];
System.arraycopy(codes, 1, encodes, 0, encodes.length);
return encodes;
}
public ParityCode(boolean way) {
super();
this.way = way;
}
public static void main(String[] args) {
ParityCode method = new ParityCode(true);
boolean[] codes = toCodes("1010111");
System.out.println("origin codes: " + codesString(codes));
boolean[] encode = method.encode(codes);
System.out.println("codes after encode: " + codesString(encode));
transfer(encode);
System.out.println("codes after transfer: " + codesString(encode));
boolean[] decode = method.decode(encode);
System.out.println("codes after encode: " + codesString(decode));
}
}
上体育去了,明天再写,今天就不写了。本来是是准备学信号系统的,可是学长在面试,吵得我学不了,然后我就只好敲代码了,因为敲代码可以带着耳机。也就是说我在学信号,学一半被打断才无奈之下看了会校验码,所以我上完体育肯定回来是继续学信号系统的。这个就明天再写吧。嘴上说是明天,但我觉得我下周才写都有可能。



