gpt4 book ai didi

python - 如何将 Python 2.7 解码更新为 Python 3.7

转载 作者:太空宇宙 更新时间:2023-11-04 00:00:47 24 4
gpt4 key购买 nike

我有一个 Python 2.7 脚本,用于解码从 UR5 机械臂接收到的数据。花了很多时间试图让它在 Python 3.7 中工作,但没有成功。

我发现 2.7 和 3.7 接收/保存数据的方式非常不同。我尝试了 .decode() 和 encode() 组合的多种组合。 Python 3.7 脚本的预期结果是 -4.00047543309

提前致谢

import socket
import time
import struct

HOST = "192.168.0.5" # The remote host
PORT = 30003

print "Starting Program"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
packet_1 = s.recv(4)
packet_2 = s.recv(8)
packet_3 = s.recv(48)
packet_4 = s.recv(48)
packet_5 = s.recv(48)
packet_6 = s.recv(48)
packet_7 = s.recv(48)
packet_8 = s.recv(48)
packet_9 = s.recv(48)
packet_10 = s.recv(48)
packet_11 = s.recv(48)

packet_12 = s.recv(8)
print packet_12
packet_12 = packet_12.encode("hex")
print packet_12
x = str(packet_12)
print packet_12
x = struct.unpack('!d', packet_12.decode('hex'))[0]
print x
print "X = ", x * 1000

s.close()
print "Program finish"

此代码有效并返回以下内容

Starting Program
¿pbÍruè
bf7062cd72750fe8
bf7062cd72750fe8
-0.00400047543309
X = -4.00047543309
Program finish

下面的代码是我试过的

import socket
import time
import struct
import codecs

HOST = '192.168.0.5'
PORT = 30003
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

print ("Connected")
packet_1 = s.recv(4)
packet_2 = s.recv(8)
packet_3 = s.recv(48)
packet_4 = s.recv(48)
packet_5 = s.recv(48)
packet_6 = s.recv(48)
packet_7 = s.recv(48)
packet_8 = s.recv(48)
packet_9 = s.recv(48)
packet_10 = s.recv(48)
packet_11 = s.recv(48)

packet_12 = s.recv(8)
print (packet_12)

s.close()

print ("Program finish")

返回

Connected
b'\xbfpb\xcdru\x0f\xe8'
Program finish

最佳答案

您可以非常轻松地将 Python 3 中的 packet_12 字节串转换为您在 Python 2 中打印的所有不同格式。它们似乎是:ISO 8859-1,十六进制(打印两次,出于某种原因), double float ,以及相同的 float 乘以 1000 并带有字符串前缀。

import binascii
import struct

packet_12 = s.recv(8)
print(packet_12.decode('latin-1')) # prints ¿pbÍruè
print(binascii.hexlify(packet_12).decode()) # prints bf7062cd72750fe8
x = struct.unpack('!d', packet_12)[0]
print(x) # prints -0.004000475433091545
print(f"X = {x*1000}"} # prints X = -4.0004754330915455

Python 3 处理此数据的方式与 Python 2 处理此数据的方式之间的主要区别在于,Python 3 更清楚哪些数据是编码的字节串,哪些是解码的 Unicode 文本。在上面的所有代码行中,我打印出一个 Unicode 字符串,或者在 print(x) 的情况下,一个 Python 会为我转换为字符串的数字。

值得注意的是,这个问题最重要部分的代码在 Python 版本之间几乎完全相同。 struct 模块需要一个字节串,这正是您在 socket.recv 调用后在 packet_12 变量中拥有的。唯一真正的区别是 print 现在是一个函数。我利用了 Python 3 的新功能 f-strings 来格式化输出,但 print("X = ", x * 1000) 也能正常工作。

关于python - 如何将 Python 2.7 解码更新为 Python 3.7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55800937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com