我写了2个功能很好的功能,但我想改变部分代码以提高效率,使用for循环,每8个图表都有“跳转”。
当我运行verify_checksum
时,我得到:
AttributeError: 'int' object has no attribute 'split'
但是当我使用#
的行注释运行它时,它可以正常工作。
任何想法如何修改它而不改变代码的其他部分? (有更多的功能与这些功能一起使用,它会造成混乱)。
我的代码:
def xor_bytes(byte1, byte2):
byte1, byte2=byte1.split(), byte2.split()
xor=""
a=0
for i in byte1:
for j in i:
t=int(byte2[0][a])^int(j)
xor+="".join(str(t))
a+=1
return xor
def verify_checksum(datagram):
datagram=list(datagram)
org_checksum=datagram[48:56]
org_checksum="".join(org_checksum)
x=48
for i in datagram[48:56]:
datagram[x]='0'
x+=1
datagram="".join(datagram)
res=xor_bytes(datagram[0:8], datagram[8:16])
for i in (16,88,8):
res=xor_bytes(res, i)
#res=xor_bytes(res,datagram[16:24])
#res=xor_bytes(res,datagram[24:32])
#res=xor_bytes(res,datagram[32:40])
#res=xor_bytes(res,datagram[40:48])
#res=xor_bytes(res,datagram[48:56])
#res=xor_bytes(res,datagram[56:64])
#res=xor_bytes(res,datagram[64:72])
#res=xor_bytes(res,datagram[72:80])
#res=xor_bytes(res,datagram[80:88])
if res==org_checksum:
return True
else:
return False
输入:
verify_checksum("1111000000001111000011111111000001010101101010101010111001110011001000000110101101101001")
输出:
True
答案 0 :(得分:2)
你有一个for
循环:
for i in (16,88,8):
res=xor_bytes(res, i)
然后尝试在.split
函数中i
(这是一个整数)上调用xor_bytes
:
byte1, byte2=byte1.split(), byte2.split()
(i
作为byte2
传入。
我不确定你要在这里完成什么,所以我无法帮助你解决问题,但这就是它发生的原因。
也许你想要这样的东西:
bytes_range = range(16,89,8) #make 89 the upper bound so that 88 is included in the range
for start,end in zip(bytes_range[:-1],bytes_range[1:]):
res = xor_bytes(res,datagram[start:end])
答案 1 :(得分:2)
您的循环看起来不像评论的行那样 任何 。
for i in range(16,88,8):
res=xor_bytes(res, datagram[i:i + 8])
答案 2 :(得分:1)
在注释掉的行中,您将两个字符串作为参数传递。
在循环中,您将传递一个字符串和一个int作为参数。
错误发生在byte2.split()上,因为它是一个int。传入数据报的一部分,而不是数字位置,你会没事的。