在 Python 中通过 UDP 接收整数
Receiving integers via UDP in Python
我正在通过 UDP 从外部程序 (Max/MSP) 接收数据。
数据正在 Python 正常。
字符串按预期输入。即,如果我发送“89-90-10-10”,它会以字符串的形式出现,我可以在 Python.
中使用
但是,如果我发送一个整数,尽管使用了 decode() 方法,它还是以 "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'
整数,我
问题是 UDP 流正在接收字节,无论您发送的是字符串还是整数。所以程序很可能将整数打包成字节。
下面的代码是一个黑客,它忽略了一些接收到的数据。
当您发送整数 1 并收到 b'int\x00,i\x00\x00\x00\x00\x00\x01'
"int" 告诉接收者这是一个整数。接下来是九个字节,其中 - 因为整数通常以 1、2、4 或 8 个字节发送。
使用最后 8 个字节不会 return 值 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)
我正在通过 UDP 从外部程序 (Max/MSP) 接收数据。
数据正在 Python 正常。
字符串按预期输入。即,如果我发送“89-90-10-10”,它会以字符串的形式出现,我可以在 Python.
中使用但是,如果我发送一个整数,尽管使用了 decode() 方法,它还是以 "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'
整数,我
问题是 UDP 流正在接收字节,无论您发送的是字符串还是整数。所以程序很可能将整数打包成字节。
下面的代码是一个黑客,它忽略了一些接收到的数据。
当您发送整数 1 并收到 b'int\x00,i\x00\x00\x00\x00\x00\x01'
"int" 告诉接收者这是一个整数。接下来是九个字节,其中 - 因为整数通常以 1、2、4 或 8 个字节发送。
使用最后 8 个字节不会 return 值 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)