Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迭代字节字符串Python3_Python_Python 3.x_Python 2.x - Fatal编程技术网

迭代字节字符串Python3

迭代字节字符串Python3,python,python-3.x,python-2.x,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后会出现错误: Typ

我是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显然不接受整数

我阅读了这些问题的答案,但我不明白如何更改代码以使其运行

如何迭代pkt并获取有效值以传递给struct.unpack

如果这是一个明显的问题,我很抱歉,但我似乎真的无法让它工作。提前谢谢

编辑 因此,也许更具体地说,我正在尝试使用raspberry pi进行ble扫描,我正在使用以下提供的代码:

代码在Python2上运行,但在Python3上,每次调用struct.pack时都会出现上述错误


==

必须使用
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

如前所述,您基本上可以用
i
替换
struct.unpack(“B”,i)[0]

因此,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

为什么不在Python 3中执行
myString+=%02x”%i
myInteger+=i*multiple
?您是否有任何理由必须使用
struct.unpack()
?可能重复@stovfl我提到我已经读过这个问题,但正如我所解释的,我不知道如何将这些答案应用到我的特定代码中。因此,我的问题是。你想使用链接的GitHub
blescan.py
,即Python 2代码,而不改变Python 3吗?@stovfl我没有说我不想改变任何东西。实际上,我正在做相反的事情,那就是找到一个在Python3中运行这段代码的解决方案。我面临的唯一问题是我在问题中提到的问题,我希望任何人都能帮助我。尝试了你的答案,代码确实运行了,但没有产生预期的结果。也许我应该更清楚一点,把全部代码都发布出来。基本上,我尝试使用raspberry pi进行BLE扫描,我使用的代码是:这段代码在Python2上运行,但在struct.pack上出现了我提到的错误。pkt变量通过pkt=sock.recv(255)获得。这有区别吗?非常感谢!您可能应该提供完整的Python2代码,包括您的测试用例。