Как использовать UDP-полученные буквенные байтовые данные - PullRequest
0 голосов
/ 09 апреля 2019

Я использовал следующий код для получения потока данных 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')

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

Метод 2:

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

Traceback (последний вызов был последним): файл "", строка 1, в UnicodeDecodeError: 'кодек utf-8' может 't декодировать байт 0xd3 в позиции 0: недопустимый байт продолжения

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

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

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

Спасибо

1 Ответ

1 голос
/ 09 апреля 2019

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

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

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

b'\xd3\x80'.decode('utf-8') => I (то есть ПИСЬМО С ПИЛОЧКОЙ U + 04C0)

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

...