struct unpack (Ошибка типа: требуется объект, похожий на байт, а не 'str'), Распаковать список?

Попытка использовать скрипт, который был построен в Python 2, и теперь использовать его в Python 3 без добавления версии 2 в систему. Для скрипта единственная ошибка, которую я получаю, связана с struct.unpack в этой строке....

def go_parse(rec_list):
    size = (len(rec_list) - 4) / 4
    first_arg = "%sI" % size
    return struct.unpack(first_arg, (rec_list.rstrip ('\xff\xff\xff\xff')))

в строке 4 этой функции я получаю ошибку:

TypeError: a bytes-like object is required, not 'str'

Я прочитал несколько других постов, касающихся этого, и что он должен быть явно помечен как байты, но я не могу понять, где явно пометить это в этом контексте. Другие примеры на SO, которые я нашел здесь и здесь, не дали большого объяснения этому. Страницы структуры, кажется, не покрывают возможности ошибки 2-3... Только тот struct.unpack(fmt, buffer) имеет два аргумента fmt и buffer. Основываясь на этих примерах, я попытался идентифицировать это как байты явно как второй аргумент, используя b, так же как bytes перед аргументами и на кортеже для.strip. Я попытался вернуть это как bytearray, но это, казалось, производило те же самые ошибки.

В качестве альтернативы, я могу получить байтовые данные, которые я хотел, в список, как показано ниже, что было бы способом получить список в распакованном виде, попытка b'i'просто смотрит на i как байты.

list1 = [b'\x03\x00\x00\x00\xff\xff\xff\xff',
b'\x07\x00\x00\x00\x06\x00\x00\x00\xff\xff\xff\xff']

print(struct.unpack('<s', bytes(i)))

Байты имеют разную длину, но все заканчиваются на \xff\xff\xff\xff. Данные, на которые я смотрю, - это текст, просто пытаюсь вернуть их к тексту.

1 ответ

Решение

Я ответил на свой вопрос, потратив некоторое время на документацию, и кто-то указал мне правильное направление.

Генерируя список двоичных данных, которые нужно было вернуть в текст для отображения, я использовал стандартную библиотеку кодеков. Все мои двоичные данные были сохранены в список с именем bin_list.

import codecs

bin_list = [b'Some Binary data', b'some more binary data']

for i in bin_list:    # used the loop to print each to new line, nice and neat
    print (codecs.decode(i, "utf-8", "ignore"))   # or any other conversion avilable on codecs.
Другие вопросы по тегам