Java简易实现海明码的偶校验

最近在学习的时候偶然看到了海明码校验,就想着自己写一下。
先来抄一下百度~
汉明码(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的位置即为最终结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值