生成海明校验码
def Input(): """ 输入字符串'0'与'1'的组合 输出两个参数:字符串的长度,字符列表 """ string = input("请输入‘0’‘1’字符串:") return len(string), list(string) # n表示字符串长度,List表示字符列表。List --> type(List[0])=string n, List = Input() def getK(n): """ param: n表示字符串长度 function:计算得到k的值,k为海明码检验位 return:返回参数k """ k = 1 while n+k > pow(2, k)-1: k += 1 return k # k为海明码检验位 k = getK(n) def getHList(n, k, List): """ param:n表示字符串长度,k表示海明码校验位,List表示'0' '1'字符列表 function:初始化列表H,将List里的字符按照规律插入H列表中,未插入的位置则是校验码的位置,初始值为-1 return:返回已经初始化列表H。H --> type(H[0])=int """ H = [-1 for i in range(k+n+1)] cnt = 0 for i in range(1, k+n+1): if i == pow(2, cnt): cnt += 1 continue H[i] = int(List.pop()) return H # 初始化列表H。H --> type(H[0])=int H = getHList(n, k, List.copy()) def getPDict(k, H): """ param: k表示海明码校验位,H表示初始化列表 function: 计算校验码的值 return: 返回字典P,键确定索引位置,值是计算出来的校验码 """ P = dict() for i in range(k): P[i] = None cnt = 0 for bi in range(1, len(H)): if bi == pow(2, cnt): cnt += 1 continue if (bi >> i)&1: if not P[i]: P[i] = H[bi] else: P[i] = P[i]^H[bi] return P # 字典P,在pow(2, key)的H索引位置上插入value P = getPDict(k, H) def insertPInH(P, H): """ param: 字典P,存储了校验码的值。初始化列表H,待插入P的值。 function:按照一定规律将P中的值插入H中 return: 返回列表H """ for key in P: Index = pow(2, key) H[Index] = P[key] return H # H1 表示已经处理好的海明校验码 H1 = insertPInH(P, H.copy())
输入字符串:
海明码的校验
[-1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1]
然后将这个数据进行checking,检查是否出错。
def checking(Hs, k): """ param: Hs表示传输过来的字符串,用于验证。k表示校验位数。 function: 用来校验传输的字符串是否出错 """ # Pc得到Pi校验码 Pc = getPDict(k, Hs) print(Pc) Si = [] Svalue = 0 cnt = 0 for i in range(1, len(Hs)): if i == pow(2, cnt): Pi = Pc[cnt] value = Pi^Hs[i] Si.append(value) if value == 0 and cnt == 0: Svalue = 0 else: Svalue += pow(2*value, cnt) cnt += 1 if cnt == k: break print(Si) if Svalue: print("传输错误,错误的索引位置为:", Svalue) print("从下标0开始索引") else: print("传输无误!") checking([-1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1], k)

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232171.html原文链接:https://javaforall.net
