计算机组成原理 & 计算机网络几种校验码的java编程实现
Posted 九死九歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机组成原理 & 计算机网络几种校验码的java编程实现相关的知识,希望对你有一定的参考价值。
〇、校验码的超类
我们用面向对象的思想把校验码方式分成一个一个的类,为了提高代码重用性,就先构建一个所有校验码类型的超类,就叫他CheckCode,也就是校验码的意思。
public abstract class CheckCode {
private final static double p = 0.02;
/**
* 对二进制信息进行编码
* @param codes 需要进行编码的二进制信息
* @return 经过加密后的二进制信息
*/
public abstract boolean[] encode(boolean[] codes);
/**
* 对二进制信息进行解码
* 若出现错误则纠错或将错误信息输出到控制台
* @param codes 需要进行解码的二进制信息
* @return 经过解码后的二进制信息
*/
public abstract boolean[] decode(boolean[] codes);
/**
* 模拟二进制信息在信道上的传输过程
* 每一位都有%2的可能性发生位错
* @param codes 需要进行传输的二进制信息
*/
public static void transfer(boolean[] codes) {
for (int i = 0; i < codes.length; i++) {
if (Math.random() < p) {
codes[i] =! codes[i];
}
}
}
/**
* 将字符串转换成二进制信息
* 字符串某位为零,对应二进制信息中的那一位也为零
* 否则为一
* @param str 需要转换成二进制信息的字符串
* @return 转换成功的二进制信息
*/
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;
}
/**
* 将二进制信息转换成"0100100111"的字符串形式
* @param codes 需要转换的二进制信息
* @return 转换成功地二进制信息
*/
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{
/**
* way代表具体的校验方式,way为true是奇校验,为false是偶校验
*/
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));
}
}
上体育去了,明天再写,今天就不写了。本来是是准备学信号系统的,可是学长在面试,吵得我学不了,然后我就只好敲代码了,因为敲代码可以带着耳机。也就是说我在学信号,学一半被打断才无奈之下看了会校验码,所以我上完体育肯定回来是继续学信号系统的。这个就明天再写吧。嘴上说是明天,但我觉得我下周才写都有可能。
以上是关于计算机组成原理 & 计算机网络几种校验码的java编程实现的主要内容,如果未能解决你的问题,请参考以下文章