Запись строки ASCII как двоичной в python
у меня есть строка ASCII = "abcdefghijk". Я хочу записать это в двоичный файл в двоичном формате с помощью python.
я попробовал следующее:
str = "abcdefghijk"
fp = file("test.bin", "wb")
hexStr = "".join( (("x%s") % (x.encode("hex"))) for x in str)
fp.write(hexStr)
fp.close()
однако, когда я открываю тест.bin я вижу следующее в формате ascii вместо двоичного.
x61x62x63x64x65x66x67
Я понимаю это, потому что для двух косых черт здесь ("\x%s"). Как решить эту проблему? Спасибо заранее.
обновление :
следующий дает мне ожидаемый результат:
file = open("test.bin", "wb")
file.write("x61x62x63x64x65x66x67")
file.close()
но как это сделать с помощью строки ASCII" abcdef". ?
2 ответов
вы неправильно поняли, что \xhh
делает в строках Python. Используя \x
нотация в строках Python-это просто синтаксис произвести определенные коды.
можно использовать '\x61'
для создания строки, или вы можете использовать 'a'
, оба просто два способа сказать дайте мне строку с символом с шестнадцатеричным значением 61, например a
символ ASCII:
>>> '\x61'
'a'
>>> 'a'
'a'
>>> 'a' == '\x61'
True
на синтаксис, составляет не равно; нет \
и x
и 6
и 1
символ в конечном результате.
вы должны просто напишите свою строку:
somestring = 'abcd'
with open("test.bin", "wb") as file:
file.write(somestring)
в двоичных файлах нет ничего волшебного; единственное отличие от файла, открытого в текстовом режиме, заключается в том, что двоичный файл не будет автоматически переводить \n
новые строки к стандарту разделителя строк для вашей платформы; например, на Windows writing \n
производит \r\n
вместо.
вам, конечно, не нужно создавать шестнадцатеричные экранирования для записи двоичных данных.
на Python 3 строки являются данными Unicode и не могут быть просто записаны в файл без кодировки, но на Python str
тип уже закодированных байтов. Итак, на Python 3 Вы бы использовали:
somestring = 'abcd'
with open("test.bin", "wb") as file:
file.write(somestring.encode('ascii'))
или вы бы использовали строковый байтовый литерал;b'abcd'
.
Я думаю, вы не обязательно понимаете, что такое binary/ascii ... все файлы являются двоичными в том смысле, что это просто биты. ascii-это просто представление некоторых битов... 99.9999 % редакторов файлов будут отображать ваши биты как ascii, если они могут, и если в самом файле нет другой кодировки...
fp.write("abcd")
и именно equivelent to
fp.write("\x61\x62\x63\x64")