#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
.