0

我写了 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
4

3 回答 3

2

你有一个for这样的循环:

for i in (16,88,8):
    res=xor_bytes(res, i)

然后您尝试在函数中调用.spliton 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])
于 2012-12-12T16:53:45.040 回答
2

您的循环看起来不像注释行。

for i in range(16,88,8):
    res=xor_bytes(res, datagram[i:i + 8])
于 2012-12-12T16:56:58.367 回答
1

在注释掉的行中,您将两个字符串作为参数传递。

在循环中,您传递一个字符串和一个 int 作为参数。

错误出现在 byte2.split() 上,因为它是一个 int。传入数据报的一部分,而不是数字位置,你会没事的。

于 2012-12-12T16:57:24.420 回答