В 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'
, то это просто число, которое нельзя повторить.