Как мне разобрать этот тип байтов? - PullRequest
1 голос
/ 15 апреля 2020

У меня есть следующий тип байтов:

b = b'2787\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x05\x03\x01\x00\x00\x00\x00\x00\x96\x08\n\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x0047\x00>2!\tMV\xa7\x00\x00\x00\x00'

Я должен преобразовать его в строку и получить 2787, как я должен вырезать значения \ x00, я только что попробовал с decode ("utf- 8 "), но выдает следующее сообщение об ошибке:

код 'utf-8' c не может декодировать байт 0x96 в позиции 33: недопустимый начальный байт

также rstrip ('\ x00 ) не работает.

Какой тип декодирования мне следует использовать?

Отсюда я получаю список строк:

data, addr = socket_udp.recvfrom(struct.calcsize("B13s9s61s"))
info = struct.unpack("B13s9s61s", data)

И b - последняя 61 строка. Содержимое строки:

class Udp_packet:
type = 0x00
id  = ""
random_num = ""
data = ""


def __init__(self, values_list, convert=False):       
    self.type       = values_list[0]
    self.id         = values_list[1]
    self.random_num = values_list[2]
    self.data       = values_list[3].split("\0")[0]

Код работает правильно, используя python 2.7, я только что перешел на 3.7.5

1 Ответ

2 голосов
/ 15 апреля 2020

То, что вы хотите от b, это, очевидно, часть перед первым байтом NUL, b'\x00' или просто b'\0', так что вы можете нарезать b по индексу первого байта NUL:

b = b[:b.find(b'\0')]
...