Java实现海明码的编码与译码

Java实现海明码(汉明码)的编码与译码

海明码简介

汉明码(Hamming Code),是在电信领域的一种线性调试码,以发明者理查德·卫斯里·汉明的名字命名。汉明码在传输的消息流中插入验证码,当计算机存储或移动数据时,可能会产生数据位错误,以侦测并更正单一比特错误。由于汉明编码简单,它们被广泛应用于内存(RAM)。(摘自百度百科

海明码是一种可以纠正一位差错的编码。它是利用在信息位为k位,增加r位冗余位,构成一个n=k+r位的码字,然后用r个监督关系式产生的r个校正因子来区分无错和在码字中的n个不同位置的一位错。它必需满足以下关系式: 2^r ≥ k+r+1 或 2r ≥ n+1 海明码的编码效率为: R=k/(k+r) 式中 k为信息位位数 r为增加冗余位位数。(摘自搜狗百科

海明码冗余位的位置

海明码的编码规则如下:
可以看到,p1算作二进制中的第一位,p2算作二进制中的第二位,以此类推
海明码的编码规则
但是,冗余位并不一定是在上图的那些位置,也可以放在别的地方(可以自行验证),但是为了方便一般都会这么放。1、2、4、8、16 等下标对应的二进制数只有一位是1,其他位置都是0。这样编码和译码做奇偶校验的时候,只用异或所有下标的二进制数对应位置为1的数。

Java实现

海明码只能纠错一位。下述实现,译码过程实现了自动纠错一位,但如果有多个错误,可能译码出错误的结果。

public class HammingCode {
   
    /**
     * 偶校验
     */
    public static final int EVEN_PARITY = 0;
    /**
     * 奇校验
     */
    public static final int ODD_PARITY = 1;
    /**
     * 编码译码时使用的校验模式,默认为偶校验
     */
    private int checkMode = EVEN_PARITY;

    /**
     * 译码是否成功
     */
    private boolean decodeSuccess = false;
    /**
     * 译码的时候,是否检测到输入错误
     */
    private boolean errorSrc = false;
    /**
     * 译码的时候,检测到输入错误在第几位
     */
    private Integer errorIndex;


	// 无参构造
    public HammingCode() {
   }
	// 有参构造, 用与选择是奇校验还是偶校验
    public HammingCode(int checkMode) {
   
        if (checkMode == ODD_PARITY) {
   
            this.checkMode = ODD_PARITY;
        } else {
   
            this.checkMode = EVEN_PARITY;
        }
    }

	// 编码
    public String code(String src) {
   
        // 校验输入数据
        if (src == null || src.equals("")) {
   
            return "输入为空";
        }
        String[] srcArray = src.trim().split(""
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值