Как использовать литеральные байтовые данные, полученные по протоколу UDP

#python #python-3.x #byte #literals

#питон #python-3.x #байт #литералы #python

Вопрос:

Я использовал следующий код для получения потока данных UDP от отправителя в моей сети:

 import socket
import datetime

## Configs
UDP_IP = "169.254.67.186"
UDP_PORT = 5606 #PC1 uses 5606

## Creating socket object
sock = socket.socket(socket.AF_INET,
                     socket.SOCK_DGRAM)  #AF_INET specifies that IPs are going to be used. #DGRAM specifies that it is going to be under UDP
address = (UDP_IP,      # IP Address
           UDP_PORT)    # Port of that IP
sock.bind(address)

## Progrma startup message
timestamp = datetime.datetime.now().time()
print("Initiating data print at:",timestamp)
print("-------------------------------------------")

i = 1

## Initiates loop to 'listen'
while i < 10:
    # Function to recieve data
    data,senderaddr = sock.recvfrom(10240000) # Argument is the buffer size (maximum size of data being received at once). # Two outputs are given, the "data" output and the "address from senders" output.
    print("Streaming:",data)
    i = i   1
  

Он все еще находится в периоде тестирования, поэтому я получаю только 10 пакетов данных и завершаю цикл while. В любом случае, начало переменной ‘data’ в настоящее время:

Начало значений переменных ‘data’

Это в основном формат, который я получаю из потока. Оглядываясь вокруг, я узнал, что это литеральная байтовая переменная Python 3 (я использую P3), и есть несколько способов декодирования ее в полезные строки, которые не сработали, например

Способ 1:

 str(data, 'utf-8')
  

Обратная трассировка (последний последний вызов): файл «», строка 1, в
UnicodeDecodeError: кодек ‘utf-8’ не может декодировать байт 0xd3 в
позиции 0: недопустимый байт продолжения

Способ 2:

 import binascii
data.decode("utf-8")
  

Обратная трассировка (последний последний вызов): файл «», строка 1, в
UnicodeDecodeError: кодек ‘utf-8’ не может декодировать байт 0xd3 в
позиции 0: недопустимый байт продолжения

Ни один из них мне действительно не помог. Я заметил этот формат b» xx0 x00 xx0 x00 x00 x00 …не является распространенным примером, используемым для преобразования литеральных байтов. В потоках, которые я обнаружил, люди больше используют формат b «abcdef» для описания своей проблемы (без обратной косой черты, которая, кажется, разделяет отдельные символы), поэтому, я думаю, я могу что-то здесь упустить. Имеет смысл думать, что методы, которые я пытаюсь использовать, не являются правильными из-за этой части сообщений об ошибках:

кодек не может декодировать байт 0xd3 в позиции 0: недопустимый байт продолжения

Итак, не могли бы вы, ребята, помочь мне рассказать, чего мне здесь не хватает?

Спасибо

Комментарии:

1. Какие данные отправляются с другого конца?

2. @Dinesh Это канал UDP из игры Project Cars. Проверьте два файла в этом репозитории: github.com/AlexandrePiccini/Personal . packetsender_export — это один пакет данных, полученный с помощью программы PacketSender, хотя я мог получить только шестнадцатеричные значения с помощью этого метода, а не те, с которыми у меня возникли проблемы. udpDataSample — это образец данных, который не представляет те же данные, что и раньше (соответствующие другому условию), полученные с помощью Python, и это просто фрагмент всей полученной строки данных (по причинам отладки я разбил его на небольшую единицу).

3. @AlexandrePiccini, вы когда-нибудь находили решение этого вопроса? У меня аналогичная проблема, и я застрял на несколько дней.

Ответ №1:

Это потому, что ваш data bytearray не представляет UTF-8 закодированные данные.

Имеет смысл, что xd3 за a x04 следует недопустимая UTF-8 последовательность, потому что в соответствии со спецификацией UTf-8 (ссылка на Википедию) значения между 0x80 и 0x7FF должны быть представлены двумя байтами формата 110x xxxx и 10xx xxxx , но более конкретно, поскольку мы говорим о стандарте Unicode, это означает, что в любом месте от xc2 до xdf дляпервый байт и x80 to xbf для второго байта, следовательно, a xd3 , которому не предшествует что-либо между x80 и xbf не является допустимым формированием unicode.

Демонстрация:

b'xd3x80'.decode('utf-8') => I (который является КИРИЛЛИЧЕСКОЙ БУКВОЙ ПАЛОЧКА U 04C0)

если мы пойдем на один уровень ниже: b'xd3x79'.decode('utf-8') он выдаст UnicodeDecodeError сообщение о том, почему x79 оно находится 0111 1001 в двоичном формате и не соответствует 1xxx xxxx шаблону, установленному для UTF-8 .