В 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 uses the concepts of text and (binary) data instead of Unicode strings and 8-bit strings. All text is Unicode; however encoded Unicode is represented as binary data.
Таким образом, в версии Py2 вывод представляет собой строку, а в версии Py3 — двоичные данные типа bytes.
Но мне очень нужна струнная версия!
Согласно вышеупомянутому документу:
As the str and bytes types cannot be mixed, you must always explicitly convert between them. Use str.encode() to go from str to bytes, and bytes.decode() to go from bytes to str. You can also use bytes(s, encoding=...) and str(b, encoding=...), respectively.
Итак, теперь мне нужно декодировать эти двоичные данные типа bytes…
>>> 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
Ой! Меня не интересуют кодировки UTF-8.
Могу ли я просто получить фиктивный сквозной кодек?
PS
Зачем мне '\x00\xaa\xff' вместо b'\x00\xaa\xff'?
Потому что я беру эту строку и передаю ее в
crc функция, написанный на чистом питоне
crc16pure.crc16xmodem('\x00\xaa\xff')
Эта функция предполагает перебор строки, состоящей из байтов.
Если я даю функцию b'\x00\xaa\xff', то это просто число, которое нельзя повторять.
bytes. Если вы пишете код для работы с текстом, вам следует использовать тип str.
@Error-SyntacticalRemorse Вопрос в заголовке





Вопрос: Можно ли просто получить фиктивный сквозной кодек?
Ответ: Да, используйте iso-8859-1
В python3 следующее не работает
b'\x00\xaa\xff'.decode()
Кодек по умолчанию «utf-8» не может декодировать байт 0xaa
Пока вы не заботитесь о наборах символов (например, какой символ вы видите, когда вы print()) и просто хотите строку из 8-битных символов, как то, что вы получили бы в python2, тогда используйте 8-битный кодек исо-8859-1
b'\x00\xaa\xff'.decode('iso-8859-1')
Был ли в этом вопрос?