В Python 2 str
и bytes
были одинаковыми, поэтому, когда вы писали '\xff'
, результат содержал фактический байт 0xFF
.
В Python 3 str
ближе к объекту unicode
в Python 2 и не является псевдонимом для bytes
. \xff
больше не является запросом на вставку байта, а скорее является запросом на вставку символа Unicode, код которого может быть представлен в 8 битах. Строка печатается с вашей кодировкой по умолчанию (возможно, UTF-8), в которой символ 0xFF кодируется как байты \xc3\xbf
. \x
- это в основном однобайтовая версия \u
, когда она появляется в строке. Это все то же самое, что и раньше, когда оно появляется в bytes
.
Теперь для решения. Если вам просто нужно несколько байтов, сделайте
b'\xff'
Это будет работать так же, как в Python 2. Вы можете записать эти байты в двоичный файл, но затем не сможете печатать напрямую, поскольку все, что вы печатаете, конвертируется в str
. Проблема печати заключается в том, что все кодируется в текстовом режиме. К счастью, sys.stdout
имеет атрибут buffer
, который позволяет вам выводить bytes
напрямую:
sys.stdout.buffer.write(b'\xff\n')
Это будет работать, только если вы не замените sys.stdout
чем-то необычным, у которого нет buffer
.