为了账号安全,请及时绑定邮箱和手机立即绑定

从 Python 2.7 更改为 Python 3.7 数据后得到一个额外的字母?

从 Python 2.7 更改为 Python 3.7 数据后得到一个额外的字母?

素胚勾勒不出你 2023-06-20 13:26:42
我正在开发一个程序,该程序从通过 WiFi 发送的 Android 应用程序接收字符串,该程序最初是为 Python 2.7 编写的,但在添加了一些附加功能后,我将其更改为 Python 3.7。然而,在做出这种改变之后,我的数据前面多了一个字母,我终究无法弄清楚为什么会这样。这是我的代码片段,这是一个非常简单的 if 语句,用于查看从 Android 应用程序发送了哪个命令并使用该命令控制 Raspberry Pi (4) cam (v.2)。这部分设置连接并等待查看我发送的命令。isoCmd = ['auto','100','200','300','400','500','640','800']HOST = ''PORT = 21567BUFSIZE = 1024ADDR = (HOST,PORT)brightness = 50timelapse = 0tcpSerSock = 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。(这有意义吗?)我的意思是,我知道我可以毫无问题地发送命令,只是不确定如何去掉多余的字母。如果有人能给我一些建议,那就太好了。感谢您的帮助。
查看完整描述

2 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

字节串由 b 前缀表示。虽然您可以在打印输出中看到字符串,但它们本质上是字节。

要从中获取普通字符串,decode函数可以提供帮助。

dataStr.decode("utf-8")


查看完整回答
反对 回复 2023-06-20
?
森栏

TA贡献1810条经验 获得超5个赞

b'data'仅表示引号内的数据已以字节形式接收,如其他答案中所述,您必须对其进行解码才能以decode('utf-8')字符串形式获取它。


我已经在下面更新了您的程序,以兼容 v3.7+


from socket import *

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).decode('utf-8')

            print ("Here's data "+data)

            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)

    except Exception as e:

        print(e)


查看完整回答
反对 回复 2023-06-20
  • 2 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信