2017-05-08 2 views
0

Ich versuche, eine Zeichenfolge zu maskieren, indem es wie folgt kodiert:Lese String als Bytes codiert Objekt

>>> 'monkey'.encode('utf-16') 
b'\xff\xfem\x00o\x00n\x00k\x00e\x00y\x00' 

Ich kopiere dann \xff\xfem\x00o\x00n\x00k\x00e\x00y\x00 und es in eine Datei file.txt einfügen.

Dann möchte ich diese Datei lesen und dekodieren.

>>> with open('file.txt', 'rb') as f: 
>>>  bytes_object = next(f).strip() # assume file has only one line 
>>> bytes_object 
b'\\xff\\xfem\\x00o\\x00n\\x00k\\x00e\\x00y\\x00' 

Die \ 's werden entkommen ... nicht was ich will.

Die Decodierung funktioniert nicht wie erwartet.

>>> bytes_object.decode('utf-16') 
'硜晦硜敦屭へ漰硜〰屮へ欰硜〰履へ礰硜〰' 

Klar verstehe ich hier etwas nicht. Gibt es eine Möglichkeit, eine Datei mit dem Text \xff\xfem\x00o\x00n\x00k\x00e\x00y\x00 zu lesen und zu dekodieren?

+0

Weil, wenn Sie kopieren und einfügen kopiert die * Darstellung * nicht die tatsächlichen Bytes. –

+0

Anstelle des Kopierens in eine Textdatei * schreiben Sie die Bytes mit Python * direkt in eine Datei. –

+0

Danke @ juanpa.arrivillaga, was ich gesucht habe, war 'eval (bytes_object) .decode ('utf-16')' – AlexG

Antwort

1

Die anderen Antworten sind richtig, dass das Schreiben der Bytes sich in einer Datei als das Kopieren einfacher ist und Einfügen der repr() Form (mit die Backslash-xs).

Aber Ihre Frage war, wie dieses Formular zu analysieren, und es ist möglich, mit eval(), das ist im Grunde das Gegenteil von repr(). Hier ist eine interaktive Version, die nicht die Datei write/read verwendet, sondern die entsprechenden Operationen ausführt.

>>> s = 'monkey' 
>>> e = s.encode('utf-16') 
>>> x = str(e) 
>>> x 
"b'\\xff\\xfem\\x00o\\x00n\\x00k\\x00e\\x00y\\x00'" 
>>> eval(x) 
b'\xff\xfem\x00o\x00n\x00k\x00e\x00y\x00' 
>>> eval(x).decode('utf-16') 
'monkey' 
2

Das Kopieren und Einfügen der Darstellung des Bytes-Objekts ist nicht sinnvoll. Wenn Sie eine UTF-16-Datei erstellen möchten, versuchen Sie dies:

with open('file.txt', 'wb') as fp: 
    message = 'monkey'.encode('UTF16') 
    fp.write(message) 
+0

Dank Rob, das ist absolut der richtige Weg, um die Bytes in eine Datei zu schreiben (im Gegensatz zu was Ich mache oben) – AlexG