此篇文章只作为自己的记录,代码是通过自己对于海明码的理解,思路讲解的说明在书本中,笔记没有在手中,现只有利用python编程语言写的程序代码。代码可以进行优化,当时没有时间,现在懒得弄。有兴趣同学可以作为参考,在上面直接进行修改,或优化都可。就是优化后的同学可以@我相互学习学习。一起共勉。
在以前的学习笔记中有关于海明码的思路的笔记,连接为:(不理解的同学可以参考这篇文章是此代码的理论及思路)计算机网络_m0_64891352的博客-CSDN博客
此文章与海明码——纠错_m0_64891352的博客-CSDN博客
这两篇文章是俩姊妹,
以前的代码误操作好像删掉了,现只能找到海明码纠错的代码(这个代码是阉割版的,有修改)及运行结果是以前的截图
# xiao燃专属
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只要以上思路弄明白了就可以将所有的传输的数据的海明码计算出来了")
海明码纠错程序运行截图: