资源简介

今天上了一节组原,讲了Hamming Code,对它的代码实现比较感兴趣,于是给自己出了个题目去玩。可以海明编码,也可海明校验。

资源截图

代码片段和文件信息

from colorama import init  # 颜色库


init(autoreset=True)


class valid_bit:  # 有效位
    def __init__(self b i):
        self.num = i  # 序号
        self.bit = int(b)  # 数值
        self.link = []  # 组成成分,7 = 4 + 2 + 1


class check_bit:  # 校验位
    def __init__(self i):
        self.num = i  # 序号
        self.bit = None  # 数值
        self.link = []  # 校验位


def smallest_check_number(k):
    r = 1
    while 2 ** r - r - 1 < k:
        r += 1  # 得到最小检测位数
    return r


def is_standard(string):
    return string.count(‘1‘) + string.count(‘0‘) == len(string)


def hamming_encode(string):
    checkList.clear()
    hammingList = []
    hammingList.append(0)  # 填补0位,index即下标
    for i in range(1 len(string) + 1):
        locals()[‘b‘ + str(i)] = valid_bit(int(string[i - 1]) i)
        hammingList.append(locals()[‘b‘ + str(i)])  # 先加入b
    r = smallest_check_number(len(string))
    for j in range(1 r + 1):
        locals()[‘P‘ + str(j)] = check_bit(j)
        hammingList.insert(2 ** (j - 1) locals()[‘P‘ + str(j)])
        checkList.append(2 ** (j - 1))  # 再插入P
    for i in range(1 len(hammingList)):  # i是有效位,j是检测位
        if i in checkList:
            continue  # 跳过P
        remain = i
        for j in range(len(checkList) - 1 -1 -1):
            if remain >= checkList[j]:
                remain -= checkList[j]
                hammingList[i].link.append(checkList[j])
            if remain == 0:
                break
        for j in hammingList[i].link:
            hammingList[j].link.append(i)  # P的link中加入b的位号
    # 计算检测码
    for j in checkList:
        xor = 0
        for i in hammingList[j].link:
            xor = xor ^ hammingList[i].bit
        hammingList[j].bit = xor
    for i in range(1 len(hammingList)):
        if i in checkList:  # 检测码
            print(‘\033[1;33m%d\033[0m‘ % hammingList[i].bit end=‘‘)
        else:
            print(‘%d‘ % hammingList[i].bit end=‘‘)
    print(‘\n‘)


def hamming_correct(string):
    checkList.clear()
    hammingList1 = []  # 装位
    hammingList1.append(0)
    k = 1
    while k + smallest_check_number(k) != len(string):  # 反推r和k
        k += 1
    r = smallest_check_number(k)
    for i in range(r):
        checkList.app

评论

共有 条评论