以下是代码,有点注释
def m_two_division(rdata,chushu):
shang=[]#商
beichushu=rdata[:len(chushu)]#每一轮的被除数,此处是第一轮的被除数
for i in range(len(rdata)-len(chushu)+1):
if len(beichushu)==len(chushu):#如果这一轮被除数的长度等于除数的长度
shang.append(1)#商为1
temp=[]#余数
for j in range(len(chushu)):
temp.append(chushu[j]^beichushu[j])
k=0
if(sum(temp)!=0):#使余数的第一位变为原本余数中第一个1
while(temp[k]==0):
k+=1
beichushu=[]
for h in range(len(temp)-k):
beichushu.append(temp[h+k])
else:#如果余数全0
beichushu=[]
else:
shang.append(0)
if i!=(len(rdata)-len(chushu)):
beichushu.append(rdata[i+len(chushu)])
return beichushu#返回余数
#CRC冗余码计算
def CRC_xchange(rdata,chushu):
for i in range(len(chushu)-1):
rdata.append(0)
beichushu=m_two_division(rdata,chushu)
#求crc
crc=[]
if len(beichushu)!=len(chushu)-1:
for i in range(len(chushu)-1-len(beichushu)):
crc.append(0)
crc+=beichushu
return crc
#CRC冗余码校验
def CRC_examine(hdata,chushu):
#求余数
beichushu=m_two_division(hdata,chushu)
yushu=[]
yushu=beichushu
if len(yushu)==0:
return 1
else:
return 0
#发送数据
chushu=[1,0,0,1,1]#事先的除数
Rdata=input()#输入原始待传数据
rdata=bin(int(Rdata,16))[2:]#将原始16进制转为2进制
rdata=list(map(int,rdata))#待检验
cRc=CRC_xchange(rdata,chushu)
print('CRC',cRc)
hdata=bin(int(Rdata,16))[2:]#将原始16进制转为2进制
hdata=list(map(int,hdata))#待校验数据
for i in range(len(cRc)):
hdata.append(cRc[i])
print('待校验数据:',hdata)
Answer=CRC_examine(hdata,chushu)
print('校验结果:')
if Answer==1:
print('Right!')
else:
print('Wrong!')
print('反例:')
for i in range(len(hdata)):
for j in range(i+1,len(hdata)):
for h in range(j+1,len(hdata)):
w_data=hdata.copy()
w_data[i]=w_data[i]^1
w_data[j]=w_data[j]^1
w_data[h]=w_data[h]^1
answer=CRC_examine(w_data,chushu)
if answer==1:
print(w_data)