Python实现汉明码的编码和差错

汉明码逻辑地址(https://zhuanlan.zhihu.com/p/425393178)

实现方式一:用字符串代替二进制进行计算

1.首先根据2k  n + k + 1确定需要几阶

2.在通过函数把传入的字符串转换为列表,在2的K次方位置插入0

3.最后在异或计算确认在2的K次方位置插入0或1

import math
code = '0101101001'
code_2 ="00001010101001"
# 先根据2k  n + k + 1确定需要几阶
def count_k(code:str):
    len_code = len(code)
    for k in range(len_code):
        if pow(2,k)-1 >= len_code + k:
            return k
# 在通过函数把传入的字符串转换为列表,在2的K次方位置插入0
def gnerate_mk(codes:list):
    for code in codes:
        k = count_k(code)
        list_code = []
        index = 0
        count = 0
        for s in range(1,k+len(code)+1):
            if int(math.log2(s)) == count:
                list_code.append('0')
                count += 1
            else:
                list_code.append(code[index:index+1])
                index +=1
        # 最后在异或计算确认在2的K次方位置插入0或1
        for s in range(k):
            result = 0
            public_errand = pow(2, s)
            start = public_errand - 1
            end = start + public_errand
            for num in range(len(list_code)):
                if num >= start and num <end:
                    result += int(list_code[num])
                elif num == end:
                    start += public_errand + public_errand
                    end +=  public_errand + public_errand
            if result % 2 == 0:
                list_code[public_errand - 1] = "0"
            else:
                list_code[public_errand - 1] = "1"
        list_str = "".join(list_code)
        yield list_str
print(gnerate_mk([code]).__next__())

def check_mk(code:str):
    k =  count_k(code)
    check_code = ""
    for s in range(k):
        result = 0
        public_errand = pow(2, s)
        start = public_errand - 1
        end = start + public_errand
        for num in range(len(code)):
            if num >= start and num <end:
                result += int(code[num])
            elif num == end:
                start += public_errand + public_errand
                end += public_errand + public_errand
        if result % 2 == 0:
            check_code += "0"
        else:
            check_code += "1"
    check_code = "".join(reversed(check_code))
    check_code = int(check_code,2)
    if check_code == 0:
        return True
    else:
        raise Exception("该编码第 %s 位出现错误,反转该位置的编码即可"%check_code)

方式二:

方式二最开始我以为是错误的就想到了方式一,结果是对的。就是在2的K次方位置可以通过列表的索引直接插入。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
汉明码(Hamming Code)是一种用于错误检测和纠正的编码技术。Python可以使用位运算和逻辑运算符来实现汉明码编码。 首先,我们需要将要传输的消息按照一定的规则进行编码。在汉明码中,每一位都有特定的位置:1,2,4,8,等等。这些位置用于纠正错误。定义一个编码函数,将输入的消息转换为汉明码。代码如下: def hamming_encode(msg): # 计算所需冗余位数(r) r = 0 while 2**r < len(msg) + r + 1: r += 1 # 初始化编码列表 encoded_msg = [None] * (len(msg) + r) # 从1开始遍历消息位 j = 0 for i in range(len(encoded_msg)): if (i+1) & i == 0: encoded_msg[i] = 0 else: encoded_msg[i] = int(msg[j]) j += 1 # 计算冗余位值 for i in range(r): encoded_msg[2**i-1] = parity(encoded_msg, i) return encoded_msg def parity(msg, r): # 初始化冗余位值 result = 0 # 从冗余位开始遍历,根据特定规则计算值 i = 2**r - 1 while i < len(msg): for j in range(i, min(len(msg), i + 2**r)): result ^= msg[j] i += 2**(r+1) return result 注意,上面的代码中引用了一个名为"parity"的辅助函数。这个函数用于计算给定位的奇偶校验值。现在我们可以使用这个编码函数来编码一个消息。例如: message = "101" encoded_message = hamming_encode(message) print(encoded_message) 执行上述代码后,会得到一个列表,其中包含了汉明码编码后的消息。 以上是用Python实现汉明码编码的方法。通过这种编码方式,我们可以在传输中检测和纠正错误,提高数据传输的可靠性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值