Как декодировать байтовый объект, содержащий недопустимые байты, Python3 - PullRequest
0 голосов
/ 23 мая 2019

В python2 я могу производить эти шестнадцатеричные байты, представленные в строковом формате весь день '\x00\xaa\xff'

>>>’00'.decode('hex') + 'aa'.decode('hex') + 'ff'.decode('hex')
>>>'\x00\xaa\xff'

Точно так же я могу сделать это в python3

>>> bytes.fromhex(’00’) + bytes.fromhex(‘aa’) + bytes.fromhex(‘ff’)
>>>b'\x00\xaa\xff'

Согласно изменениям py2-> py3 здесь

Python 3.0 использует понятия текстовых и (двоичных) данных вместо строк Unicode и 8-битных строк. Весь текст в Unicode; однако кодированный Unicode представляется в виде двоичных данных.

Таким образом, в версии Py2 выводом является строка, а в версии Py3 - двоичные данные типа байтов

Но мне действительно нужна строковая версия!

Согласно вышеупомянутому документу:

Поскольку типы str и bytes не могут быть смешаны, вы всегда должны явно конвертировать между ними. Используйте str.encode () для перехода от строки к байту и bytes.decode () для перехода от байта к строке. Вы также можете использовать байты (s, encoding = ...) и str (b, encoding = ...) соответственно.

Хорошо, теперь я должен декодировать эти двоичные данные типа байтов ...

>>> b'\x00\xaa\xff'.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xaa in position 1: invalid start byte

Oops! Меня не волнует кодировка UTF-8 здесь.

Могу ли я просто получить фиктивный сквозной кодек?

PS

Зачем мне нужно '\x00\xaa\xff' вместо b'\x00\xaa\xff'?

Потому что я беру эту строку и передаю в

CRC функция написана на чистом питоне

crc16pure.crc16xmodem('\x00\xaa\xff')

Эта функция ожидает перебора строки, состоящей из байтов. Если я даю функцию b'\x00\xaa\xff', то это просто число, которое нельзя повторить.

1 Ответ

0 голосов
/ 28 мая 2019

Вопрос: могу ли я просто получить фиктивный сквозной кодек?

Ответ: Да, используйте iso-8859-1

В python3 следующее не работает

b'\x00\xaa\xff'.decode()

Кодек по умолчанию utf-8 не может декодировать байт 0xaa

Пока вы не заботитесь о наборах символов (например, какой символ вы видите, когда вы print()) и просто хотите строку из 8-битных символов, как в Python2, тогда используйте 8-битный кодек ISO-8859-1

b'\x00\xaa\xff'.decode('iso-8859-1')
...