我正在尝试将此Python 2代码翻译为Python 3。
def calculate_checksum(packet):
total = 0
for char in packet:
total += struct.unpack('B', char)[0]
return (256 - (total % 256)) & 0xff
在Python 3中,它会导致TypeError:
total += struct.unpack('B', char)[0]
TypeError: a bytes-like object is required, not 'int'
我一直在尝试研究字符串和字节的变化,但它有点压倒性。
答案 0 :(得分:2)
代码基本上将bytestring中的单个字符转换为它们的整数等价物;字符\x42
变为0x42(或十进制66),例如:
>>> # Python 2
...
>>> struct.unpack('B', '\x42')[0]
66
另外,您可以使用ord()
function:
>>> ord('\x42')
66
在Python 3中,当您遍历bytes
对象时,已经获取整数,这就是您收到错误的原因:
>>> # Python 3
...
>>> b'\x42'[0]
66
可以简单地删除整个struct.unpack()
来电:
for char in packet:
total += char
或只需使用sum()
一步计算总数:
total = sum(packet)
制作完整版本:
def calculate_checksum_ord(packet):
total = sum(ord(c) for c in packet)
return (256 - (total % 256)) & 0xff
请注意,Python 2代码也可以使用sum()
ord()
函数,而不是struct
:total = sum(ord(c) for c in packed)
。