在从Python2.7更改为Python3.7之后,数据是否得到了一个额外的字母?
我正在开发一个程序,该程序接收通过WiFi发送的Android应用程序的字符串,该程序最初是为Python 2.7编写的,但在添加了一些附加功能后,我将其更改为Python 3.7。然而,在做了这样的改变之后,我的数据在前面有一个额外的字母,就我的一生而言,我不明白为什么会这样 下面是我的一段代码,这是一个非常简单的if语句,可以查看哪个命令是从Android应用程序发送的,并用该命令控制Raspberry Pi(4)cam(v.2) 这部分设置连接并等待查看我发送的命令在从Python2.7更改为Python3.7之后,数据是否得到了一个额外的字母?,python,raspberry-pi,Python,Raspberry Pi,我正在开发一个程序,该程序接收通过WiFi发送的Android应用程序的字符串,该程序最初是为Python 2.7编写的,但在添加了一些附加功能后,我将其更改为Python 3.7。然而,在做了这样的改变之后,我的数据在前面有一个额外的字母,就我的一生而言,我不明白为什么会这样 下面是我的一段代码,这是一个非常简单的if语句,可以查看哪个命令是从Android应用程序发送的,并用该命令控制Raspberry Pi(4)cam(v.2) 这部分设置连接并等待查看我发送的命令 isoCmd = ['
isoCmd = ['auto','100','200','300','400','500','640','800']
HOST = ''
PORT = 21567
BUFSIZE = 1024
ADDR = (HOST,PORT)
brightness = 50
timelapse = 0
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True:
print ('Waiting for connection')
tcpCliSock,addr = tcpSerSock.accept()
try:
while True:
data = ''
brightness = ' '
data = tcpCliSock.recv(BUFSIZE)
dataStr = str(data[1:])
print ("Here's data ",dataStr)
if not data:
break
if data in isoCmd:
if data == "auto":
camera.iso = 0
print ('ISO: Auto')
else:
camera.iso = int(data)
print ('ISO: '), data
当我启动程序时,我看到的是:
Waiting for connection
#If I send command '300'
Here's data b'300'
Here's data b''
Waiting for connection
我不知道为什么会有额外的
b'
来自哪里。我通过在数组中每个项目的开头添加“b”来测试代码,该数组适用于我定义的任何命令,而不适用于控制Pi摄像机的任何命令,因为在开头没有额外的b。(这有意义吗?)我的意思是,我知道我可以发送命令,没问题,只是不知道如何摆脱多余的字母。如果有人能给我一些建议那就太好了。感谢您的帮助。字节字符串由b前缀表示。
虽然打印时可以在输出中看到字符串,但它们本质上是字节
要从中提取正常字符串,decode
函数可以提供帮助
dataStr.decode("utf-8")
b'data'
简单地说,引号中的数据是以字节形式接收的,正如其他答案中提到的,您必须使用decode('utf-8')
对其进行解码,才能以字符串形式获取
我已在下面更新了您的程序,以兼容v3.7+
从套接字导入*
isoCmd=[‘自动’、‘100’、‘200’、‘300’、‘400’、‘500’、‘640’、‘800’]
主机=“”
端口=21567
BUFSIZE=1024
地址=(主机,端口)
亮度=50
时间点=0
tcpSerSock=套接字(AF\u INET,SOCK\u STREAM)
tcpSerSock.bind(地址)
听一听(5)
尽管如此:
打印('等待连接')
tcpCliSock,addr=tcpSerSock.accept()
尝试:
尽管如此:
数据=“”
亮度=“”
data=tcpCliSock.recv(BUFSIZE).decode('utf-8')
打印(“此处的数据”+数据)
如果没有数据:
打破
如果数据在isoCmd中:
如果数据==“自动”:
camera.iso=0
打印('ISO:Auto')
其他:
camera.iso=int(数据)
打印('ISO:'+数据)
例外情况除外,如e:
打印(e)
b是表示字节字符串的前缀。这意味着您将获得一个字节字符串…您可以使用.decode()方法对其进行解码,如果已知/必要,还可以提供编码。如果您确定数据只包含字母或数字,请尝试以下操作:dataStr.decode(“utf-8”)
@Abhilash,效果非常好!还有很多东西要学。。。谢谢