2015-03-19 12 views
5

Ich habe eine ASCII-Zeichenfolge = "abcdefghijk". Ich möchte dies mit Python in eine Binärdatei im Binärformat schreiben.Schreiben einer ASCII-Zeichenfolge als Binärdatei in Python

Ich habe versucht, folgende:

str = "abcdefghijk" 
fp = file("test.bin", "wb") 
hexStr = "".join((("\\x%s") % (x.encode("hex"))) for x in str) 
fp.write(hexStr) 
fp.close() 

Allerdings, wenn ich öffnen Sie die test.bin ich folgendes im ASCII-Format anstatt binär zu sehen.

\x61\x62\x63\x64\x65\x66\x67 

ich es verstehe hier, weil für zwei Schrägstriche ("\\ x% s"). Wie kann ich dieses Problem beheben? Danke im Voraus.

Update:

Nach gibt mir das erwartete Ergebnis:

file = open("test.bin", "wb") 
file.write("\x61\x62\x63\x64\x65\x66\x67") 
file.close() 

Aber wie kann ich erreichen dies mit "abcdef" ASCII-String. ?

+0

Sie * sehr sorgfältig * codieren die Zeichen als hex - warum erwarten Sie, etwas anderes zu sehen? – jonrsharpe

+0

Welche Leistung haben Sie dann erwartet? Ich bin mir nicht sicher, ob du verstehst, was der binäre Modus * macht oder was Python für '\ xhh'-Notation benutzt (und es ist nur * Syntax *, eine Möglichkeit, einen Wert zu erzeugen, nicht den Wert selbst). –

+0

@jonrsharpe, ich möchte "\ x61 \ x62 \ x63 \ x64 \ x65 \ x66 \ x67" als Binärdatei in test.bin (nicht als ASCII-Zeichenfolge) schreiben. Wie kann ich das machen? Und schließlich sollte die test.bin eine Binärdatei sein. – aMa

Antwort

6

Sie falsch verstanden, was \xhh tut in Python-Strings. Mit \x Notation in Python-Strings ist nur Syntax, um bestimmte Codepunkte zu erzeugen.

Sie können '\x61' verwenden, um eine Zeichenfolge zu erstellen, oder Sie können 'a' verwenden; beide sind nur zwei Möglichkeiten zu sagen, geben Sie mir eine Zeichenfolge mit einem Zeichen mit Hexadezimalwert 61, z. das ASCII-Zeichen a:

>>> '\x61' 
'a' 
>>> 'a' 
'a' 
>>> 'a' == '\x61' 
True 

\xhh Die Syntax ist also nicht der Wert ; Es gibt keine \ und keine x und keine 6 und 1 Zeichen im Endergebnis.

sollten Sie nur Zeichenfolge schreiben:

somestring = 'abcd' 

with open("test.bin", "wb") as file: 
    file.write(somestring) 

Es gibt nichts Magisches an Binär-Dateien; Der einzige Unterschied zu einer Datei, die im Textmodus geöffnet wird, ist, dass eine Binärdatei nicht automatisch \n Zeilenumbrüche in den Zeilentrennungsstandard für Ihre Plattform übersetzt. z.B. auf Windows schreiben \n produziert \r\n stattdessen.

Sie müssen sicherlich keine Hexadezimal-Escapes zum Schreiben von Binärdaten erzeugen.

auf Python 3 Strings sind Unicode-Daten und können nicht einfach ohne Codierung in eine Datei geschrieben werden, aber auf Python den str Typ ist bereits codiertes Bytes. Also auf Python 3 würden Sie verwenden:

somestring = 'abcd' 

with open("test.bin", "wb") as file: 
    file.write(somestring.encode('ascii')) 

oder Sie würden ein Bytezeichenfolge Literal verwenden; b'abcd'.

+0

gute Erklärung ich immer über String-Änderungen in py3 vergessen –

+0

können Sie noch weiter gehen '' a 'ist' \ x61'' –

+1

@JoranBeasley: ** Nein, du kannst nicht **. Der CPython-Interpreter * kann * wählen, um zu optimieren, und Sie * könnten * mit dem gleichen String-Objekt enden (und dann 'ist' funktioniert), aber das ist ** nicht ** ratsam und Sie sollten sich nie darauf verlassen. –

1

Ich denke, Sie verstehen nicht unbedingt, was binary/ASCII ist ... alle Dateien sind binär in dem Sinne, dass es nur Bits. ascii ist nur eine Darstellung von einigen Bits ... 99,9999% der Datei-Editoren Ihre Bits als ascii angezeigt werden, wenn sie können, und wenn es keine andere Codierung in der Datei selbst deklariert ist ...

fp.write("abcd") 

ist genau equivelent zu

fp.write("\x61\x62\x63\x64")