我正在通过UDP从外部程序(Max / MSP)接收数据。
数据很好地进入了Python。
字符串按预期进入。也就是说,如果我发送“ 89-90-10-10”,则会以我可以在Python中使用的字符串的形式出现。
但是,如果我发送一个整数,尽管使用了encode()方法,它也仍然是“ int。,i.����”。
我的代码出了什么问题?
import socket
UDP_IP_ADDRESS = "127.0.0.1"
UDP_PORT_NO = 8813
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))
while True:
print (type(data))
print (repr(data))
print (data.decode("utf-8"))
如果我从其他程序通过udp发送“ 1”,则会在Python中收到以下输出:
b'int \ x00,i \ x00 \ x00 \ x00 \ x00 \ x00 \ x01'
int,i
答案 0 :(得分:1)
问题在于UDP流正在接收字节,无论您发送字符串还是整数。因此程序可能会将整数打包成字节。
下面的代码是一个黑客,忽略了一些接收到的数据。
当您发送整数1并接收b'int \ x00,i \ x00 \ x00 \ x00 \ x00 \ x00 \ x01'
“ int”告诉接收者这是一个整数。随后是9个字节,其中整数通常以1、2、4或8个字节发送。
使用后8个字节不会返回值1,但使用后四个字节会返回值,因此下面的代码将字节[-4:]切片为仅获取后四个。
可能有一些文档或开放源代码项目可以正确处理Max / MSP数据,所以我建议对此进行研究。
这是用于导入数据的结构导入的文档: https://docs.python.org/3/library/struct.html
import socket
import struct
UDP_IP_ADDRESS = "127.0.0.1"
UDP_PORT_NO = 8813
serverSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverSock.bind((UDP_IP_ADDRESS, UDP_PORT_NO))
while True:
data, addr = serverSock.recvfrom(65536)
if data.startswith(b'int'):
# assumes 4 byte unsigned integer
received = struct.unpack('!I', data[-4:])[0]
else:
received = data.decode('utf-8')
print (repr(data)) # for debug purposes
print (type(received), received)