在 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)