我是Python的初学者,正在运行这段代码:
myInteger = 0
multiple = 256
myString = ""
for i in pkt:
myString += "%02x" %struct.unpack("B", i)[0]
myInteger += struct.unpack("B", i)[0] * multiple
multiple = 1
其中pkt是字节字符串。
此代码在Python 2中可以正常工作,但是升级到3后,会出现错误:
TypeError: 'int' does not support the buffer interace
经过研究,我发现在Python2中,一个字节字符串是一个字符串,因此,在对其进行迭代时,我们得到了单字节字符串。但是在Python3中,我们得到了整数,显然struct.unpack不接受整数。
我阅读了这些问题的答案,但是我不明白如何更改代码才能使其运行。
Why do I get an int when I index bytes?
iterate over individual bytes in python3
Porting struct.unpack from python 2.7 to 3
如何遍历 pkt 并获取有效值以传递给 struct.unpack ?
如果这是一个显而易见的问题,我深表歉意,但我似乎真的无法解决这个问题。预先感谢!
所以也许更具体地说,我正在尝试使用树莓派进行ble扫描,并且正在使用以下提供的代码:
https://github.com/switchdoclabs/BeaconAirPython/blob/master/ble/blescan.py
代码在Python2上运行,但在Python3上,每次在 struct.pack 上的调用都给出上述错误。
====
答案 0 :(得分:0)
您必须使用int.to_bytes
方法将整数转换为字节:
myString += "%02x" %struct.unpack("B", int.to_bytes(i, 1, 'big'))[0]
myInteger += struct.unpack("B", int.to_bytes(i, 1, 'big'))[0] * multiple
答案 1 :(得分:0)
如对Porting struct.unpack from python 2.7 to 3的最高回答中所述,您基本上可以将struct.unpack("B", i)[0]
替换为i
。
因此,以下是Python 2中的以下代码:
myInteger = 0
multiple = 256
myString = ""
pkt = "python"
for i in pkt:
myString += "%02x" % struct.unpack("B", i)[0]
myInteger += struct.unpack("B", i)[0] * multiple
multiple = 1
print myString, myInteger
# output: 707974686f6e 29234
成为Python 3:
myInteger = 0
multiple = 256
myString = ""
pkt = b"python"
for i in pkt:
myString += "%02x" % i
myInteger += i * multiple
multiple = 1
print(myString, myInteger)
# output: 707974686f6e 29234