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.