计算机组成原理 & 计算机网络几种校验码的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编程实现的主要内容,如果未能解决你的问题,请参考以下文章

计算机组成原理海明码

计算机组成原理——加减运算 & 溢出判断

计算机组成原理——加减运算 & 溢出判断

(计算机组成原理)第二章数据的表示和运算-第一节4:校验码

计算机组成原理

再也不怕《计算机组成原理》这门课了