2016-04-04 3 views
0

Итак, у меня есть этот кусок кода:Запись необработанных байтов в файл Python3 приводит к неожиданному выходу

f = open("crash.txt", "w") 
junk = ("\xCC" * 1028) 
f.write(junk) 
f.close() 

Когда я бегу это на Windows (3.5.1), я получаю файл с повторными " CC "в виде шестнадцатеричных символов. Это так, как ожидалось.

Однако, работая на Linux (Python 3.4.2), я получаю повторяющиеся «c38c» как шестнадцатеричные символы.

Я не понимаю выход на Linux. Почему это происходит и как это исправить.

+0

Что вы подразумеваете под c38c как hex? Вы имеете в виду '\ xc3 \ x8c'? – Reti43

+0

@ Reti43 Да. Когда я смотрю содержимое файла в шестнадцатеричном редакторе. – user1720897

ответ

1

Вы не пишете необработанные байты. По умолчанию Python 3 использует строки Unicode, и эти строки должны быть закодированы, чтобы записать их в файл. Также по умолчанию open() использует текстовый режим, а кодировка, используемая для кодирования текста, - locale.getpreferredencoding(). В Windows Windows это cp1252, но в Linux обычно utf8.

b'\xc3\x8c' является '\xcc' закодировано в utf8.

b'\xcc' является '\xcc' закодировано в cp1252.

Открыть файл в двоичном режиме и написать строки байтов вместо Unicode для записи «необработанных» байтов.

with open("crash.txt", "wb") as f: 
    junk = b"\xCC" * 1028 
    f.write(junk) 
+0

Отлично. Спасибо, что поняли! – user1720897

+0

@Mark Tolonen Я пытаюсь записать переменную типа байта в файл. любое предложение? –

Смежные вопросы