此文章与海明码——纠错_m0_64891352的博客-优快云博客
这两篇文章是俩姊妹,结果都是对的。貌似有过修改,但自己记不太清了。
关于海明码的思路的笔记,连接为:(不理解的同学可以参考这篇文章是此代码的理论及思路)计算机网络_m0_64891352的博客-优快云博客
此代码是非常简易版的,非常希望有兴趣的同学,可以在此基础上或者有其他想法解决思路的同学能对此进行更进。如有指教的请多多指教,相互交流,一起共勉。加油!加油(ง •_•)ง!!!
# 肖燃专属
import math
userin = input("请输入海明码:")
haiming_old = list(userin)
# 输入的海明码是字符串,下面的代码是将字符串转化成整型列表
haiming=[]
for x in userin:
haiming.append(int(x))
# print(haiming)
#将输入列表中元素的位置进行调换
size = len(haiming)
cishu=int(size/2)
for x in range(0,cishu):
temp=haiming[x]
haiming[x]=haiming[size-1-x]
haiming[size-1-x]=temp
print("元素位置调换之后的海明码为:",haiming)
# 计算校验码的个数
#公式:所传二进制内容的长度+校验码个数《=2**校验码个数-1
for i in range(100):
if 2 ** i -i>= len(haiming)+1:
break
num=i
print("需要生成%d个校验码."%num)
#实现选择奇偶校验方式
print("#当a=0,b=1时是奇校验.反之为偶校验")
a=eval(input("请输入a的值:"))
b=eval(input("请输入b的值:"))
#实现奇校验
#2^0第一个校验位
if num==0 :
print("所传输的数据长度无法生成海明码")
elif num==2:
print("需要传输的数据个数为1位,则需要2位校验码")
#生成①号位的校验码
if haiming[0]==0:
haiming.insert(0,b)
print("校验位2**0:位置添加校验后的海明码为:", haiming)
# 生成②号位的校验码,也就是2**1=2
if haiming[1]==1:
haiming.insert(1,a)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(0,b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(0,a)
print("校验位2**0:位置添加校验后的海明码为:", haiming)
# 生成②号位的校验码,也就是2**1=2
if haiming[1]==1:
haiming.insert(1,a)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(0,b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
print(haiming)
elif num==3:
print("需要传输的数据个数为2~4位,则需要3位校验码")
if(len(haiming)==2):
#需要传输的数据是2位时
#生成①号位的校验码,也就是2**0=1
if (int(haiming[0]+haiming[1])%2==1):
haiming.insert(0,a)
print("校验位2**0:位置添加校验后的海明码为:", haiming)
#生成②号位的校验码,也就是2**1=2
if (haiming[1]==1):
haiming.insert(1,a)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (haiming[3] == 0):
haiming.insert(3, b)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(1,b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (haiming[3] == 0):
haiming.insert(3, b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(1,b)
print("校验位2**0:位置添加校验后的海明码为:", haiming)
# 生成②号位的校验码,也就是2**1=2
if (haiming[1] == 1):
haiming.insert(1, a)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (haiming[3] == 0):
haiming.insert(3, b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(1, b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (haiming[3] == 0):
haiming.insert(3, b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
print(haiming)
elif len(haiming)==3:
#需要传输的数据是3位时
if(haiming[0]==1 and haiming[1]==0) or (haiming[0]==0 and haiming[1]==1):
haiming.insert(0, a)
print("校验位2**0:位置添加校验后的海明码为:",haiming)
# 生成②号位的校验码,也就是2**1=2
if (haiming[1] == 1 and haiming[3]==0) or (haiming[1]==0 and haiming[3]==1):
haiming.insert(1, a)
print("校验位2**1:位置添加校验后的海明码为:",haiming)
# 生成③号位的校验码,也就是2**2=4
if (haiming[3] == 0 and haiming[4]==1) or (haiming[3]==1 and haiming[4]==0):
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(3, b)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(1, b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (haiming[3] == 0 and haiming[4]==1) or (haiming[3]==1 and haiming[4]==0):
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(3, b)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(0, b)
print("校验位2**0:位置添加校验后的海明码为:", haiming)
# 生成②号位的校验码,也就是2**1=2
if (haiming[1] == 1 and haiming[3]==0) or (haiming[1]==0 and haiming[3]==1):
haiming.insert(1, a)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (haiming[3] == 0 and haiming[4]==1) or (haiming[3]==1 and haiming[4]==0):
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(3, b)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(1, b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (haiming[3] == 0 and haiming[4]==1) or (haiming[3]==1 and haiming[4]==0):
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(3, b)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
print(haiming)
elif len(haiming)==4:
#需要传输的数据是4位时
if(int(haiming[0]+haiming[1]+haiming[3])%2==1):
haiming.insert(0,a)
print("校验位2**0:位置添加校验后的海明码为:",haiming)
# 生成②号位的校验码,也就是2**1=2
if(int(haiming[1]+haiming[3]+haiming[4])%2==1):
haiming.insert(1,a)
print("校验位2**1:位置添加校验后的海明码为:",haiming)
# 生成③号位的校验码,也就是2**2=4
if(int(haiming[3]+haiming[4]+haiming[5])%2==1):
haiming.insert(3,a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(1,b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if(int(haiming[3]+haiming[4]+haiming[5])%2==1):
haiming.insert(3,a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(0,b)
print(haiming)
# 生成②号位的校验码,也就是2**1=2
if(int(haiming[1]+haiming[3]+haiming[4])%2==1):
haiming.insert(1,a)
print("校验位2**1:位置添加校验后的海明码为:",haiming)
# 生成③号位的校验码,也就是2**2=4
if(int(haiming[3]+haiming[4]+haiming[5])%2==1):
haiming.insert(3,a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(1,b)
print("校验位2**1:位置添加校验后的海明码为:",haiming)
# 生成③号位的校验码,也就是2**2=4
if((int(haiming[3]+haiming[4]+haiming[5])%2)==1):
haiming.insert(3,a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
print("生成的校验码为:",haiming)
elif num==4:
print("需要传输的数据个数为5~11位,则需要4位校验码")
#判断输入了多少个数据
if(len(haiming)==5):
#需要传输的数据是5位时
if(int(haiming[0]+haiming[1]+haiming[3]+haiming[4])%2==1):
haiming.insert(0,a)
print("校验位2**0:位置添加校验后的海明码为:",haiming)
# 生成②号位的校验码,也就是2**1=2
if(int(haiming[1]+haiming[3]+haiming[4])%2==1):
haiming.insert(1,a)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if(int(haiming[3]+haiming[4]+haiming[5])%2==1):
haiming.insert(3,a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
#生成④号位的校验码,也就是2**3=8
if(haiming[7]==1):
haiming.insert(7,a)
print("校验位2**3:位置添加校验后的海明码为:",haiming)
else:
haiming.insert(7,b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (haiming[7] == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(1,b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if(int(haiming[3]+haiming[4]+haiming[5])%2==1):
haiming.insert(3,a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
# 生成④号位的校验码,也就是2**3=8
if (haiming[7] == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (haiming[7] == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(0,b)
print("校验位2**0:位置添加校验后的海明码为:", haiming)
# 生成②号位的校验码,也就是2**1=2
if(int(haiming[1]+haiming[3]+haiming[4])%2==1):
haiming.insert(1,a)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if(int(haiming[3]+haiming[4]+haiming[5])%2==1):
haiming.insert(3,a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
# 生成④号位的校验码,也就是2**3=8
if (haiming[7] == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (haiming[7] == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(1,b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if(int(haiming[3]+haiming[4]+haiming[5])%2==1):
haiming.insert(3,a)
print("校验位2**2:位置添加校验后的海明码为:",haiming)
# 生成④号位的校验码,也就是2**3=8
if (haiming[7] == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (haiming[7] == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
print("生成的校验码为:", haiming)
elif len(haiming)==6:
#需要传输的数据是6位时:
if(int(haiming[0]+haiming[1]+haiming[3]+haiming[4])%2==1):
haiming.insert(0,a)
print("校验位2**0:位置添加校验后的海明码为:", haiming)
# 生成②号位的校验码,也就是2**1=2
if (int(haiming[1] + haiming[3] + haiming[4] +haiming[6]) % 2 == 1):
haiming.insert(1, a)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (int(haiming[3] + haiming[4] + haiming[5]) % 2 == 1):
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (int(haiming[7] + haiming[8]) % 2 == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (int(haiming[7] + haiming[8]) % 2 == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(1,b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (int(haiming[3] + haiming[4] + haiming[5]) % 2 == 1):
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (int(haiming[7] + haiming[8]) % 2 == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (int(haiming[7] + haiming[8]) % 2 == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(0,b)
print("校验位2**0:位置添加校验后的海明码为:", haiming)
# 生成②号位的校验码,也就是2**1=2
if (int(haiming[1] + haiming[3] + haiming[4]) % 2 == 1):
haiming.insert(1, a)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (int(haiming[3] + haiming[4] + haiming[5]) % 2 == 1):
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (int(haiming[7] + haiming[8]) % 2 == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (int(haiming[7] + haiming[8]) % 2 == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(1, b)
print("校验位2**1:位置添加校验后的海明码为:", haiming)
# 生成③号位的校验码,也就是2**2=4
if (int(haiming[3] + haiming[4] + haiming[5]) % 2 == 1):
haiming.insert(3, a)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (int(haiming[7] + haiming[8]) % 2 == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(3,b)
print("校验位2**2:位置添加校验后的海明码为:", haiming)
# 生成④号位的校验码,也就是2**3=8
if (int(haiming[7] + haiming[8]) % 2 == 1):
haiming.insert(7, a)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
else:
haiming.insert(7, b)
print("校验位2**3:位置添加校验后的海明码为:", haiming)
print("生成的校验码为:", haiming)
elif len(haiming)>=7:
print("不想写了!!!太多了。思路清晰,都可以写出来,代码需要优化")
elif num==5:
print("需要传输的数据个数为12~26位,则需要5位校验码")
print("太长了,和以上思路是一样的\n只要以上思路弄明白了就可以将所有的传输的数据的海明码计算出来了")
海明码生成截图如下: