将Python 2字节校验和计算器转换为Python 3

时间:2017-02-20 14:45:40

标签: python string python-2.7 python-3.x byte

我正在尝试将此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'

我一直在尝试研究字符串和字节的变化,但它有点压倒性。

1 个答案:

答案 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()函数,而不是structtotal = sum(ord(c) for c in packed)