Запись строки 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")