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

将Python 2字节校验和计算器转换为Python 3,python,string,python-2.7,python-3.x,byte,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中,它会导致类型错误: total += struct.unpack('B', char)[0] TypeErro

我正在尝试将这个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中,它会导致类型错误:

    total += struct.unpack('B', char)[0]
TypeError: a bytes-like object is required, not 'int'

我一直在尝试研究字符串和字节的变化,但这有点让人不知所措。

代码基本上是将bytestring中的单个字符转换为其等效整数;字符
\x42
变为0x42(或十进制66),例如:

>>> # Python 2
...
>>> struct.unpack('B', '\x42')[0]
66
顺便说一句,您可以更简单地使用以下工具:

在Python 3中,当您迭代
字节
对象时,已经得到了整数,这就是您得到错误的原因:

>>> # 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)表示压缩中的c)

该代码基本上将bytestring中的单个字符转换为其等效整数;字符
\x42
变为0x42(或十进制66),例如:

>>> # Python 2
...
>>> struct.unpack('B', '\x42')[0]
66
顺便说一句,您可以更简单地使用以下工具:

在Python 3中,当您迭代
字节
对象时,已经得到了整数,这就是您得到错误的原因:

>>> # 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

请注意,Python2代码也可以使用
sum()
,使用
ord()
函数,而不是使用
struct
total=sum(ord(c)表示压缩中的c)

我会尝试使用
字节(char)
。但a将是确保这一点的最佳方式。@Jean-Françoisfab:struct的整个
调用是多余的。它所做的只是将单个字符(无符号字符)转换为该字节的等效整数。基本上是
ord()
函数。除了在Python3中,对
字节的迭代已经只给出整数了。@MartijnPieters当然!有时我忘了看大图,我会尝试
bytes(char)
。但a将是确保这一点的最佳方式。@Jean-Françoisfab:struct的整个
调用是多余的。它所做的只是将单个字符(无符号字符)转换为该字节的等效整数。基本上是
ord()
函数。除了在Python3中,对
字节的迭代已经只给出整数了。@MartijnPieters当然!有时我忘了看大局