Получение целых чисел через UDP в Python - PullRequest
0 голосов
/ 29 января 2019

Я получаю данные из внешней программы (Max / MSP) по UDP.

Данные поступают в Python нормально.

Строки поступают, как и ожидалось.то есть, если я посылаю «89-90-10-10», он приходит как строка, которую я могу использовать в Python.

Однако, если я отправляю одно целое число, он приходит как «int�, яDespite "несмотря на использование метода decode ().

Что не так в моем коде?

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

Если я отправлю" 1 "через udp из другой моей программы,Я получаю следующий вывод в Python:

b'int \ x00, i \ x00 \ x00 \ x00 \ x00 \ x00 \ x01 '

int, i

1 Ответ

0 голосов
/ 29 января 2019

Проблема заключается в том, что поток UDP принимает байты независимо от того, отправляете ли вы строку или целое число.Таким образом, программа, вероятно, упаковывает целое число в байты.

Приведенный ниже код является хаком, который игнорирует некоторые полученные данные.
Когда вы отправляете целое число 1 и получаете b'int \ x00, i \ x00 \ x00 \ x00 \ x00 \ x00\ x01 'int' говорит получателю, что это целое число.Далее следуют девять байтов, где целые числа обычно отправляются в 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...