遍历字节字符串Python3

时间:2018-10-11 09:57:17

标签: python python-3.x python-2.x

我是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 上的调用都给出上述错误。

====

2 个答案:

答案 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