2017-12-12 4 views
1

Ich versuche, ein Python-Skript zu schreiben, um eine Hex-Zeichenfolge in ASCII zu konvertieren und das Ergebnis in einer Datei im .der-Cert-Format zu speichern. Ich kann dies in Notepad ++ mit dem Konvertierungs-Plugin tun, aber ich würde gerne einen Weg finden, um diese Konvertierung in einem Python-Skript von der Befehlszeile aus, entweder durch den Aufruf des Editors ++ NppConverter Plugin oder mit Python-Modulen.Hex-String in ASCII-Konvertierung mit Fehlern?

Ich bin ein Teil Weg dorthin, aber meine Umwandlung ist auf das ASCII-ouptut im Notizblock nicht identisch gesehen ++, unten ist ein Ausschnitt aus der Ausgabe in Notepad ++

enter image description here

Aber mein Python-Umwandlung eines etwas anzeigt verschiedene Ausgangs unter

enter image description here

Wie Sie mein Skript sehen können, werden die Zeichen in der Ausgabe fehlt, und wenn ich ehrlich bin, weiß ich nicht, warum bestimmte Blöcke o in schwarz dargestellt. Aber diese fehlenden Blöcke werden im selben Format wie das erste Bild benötigt.

Hier ist mein grundlegender Code, ich arbeite in Python 3, ich bin mit der backslashreplace Fehlerkontrolle, da dies der einzige Weg ist, kann ich die problematische hex in der Ausgabedatei

result = bytearray.fromhex('380c2fd6172cd06d1f30').decode('ascii', 'backslashreplace') 

text_file = open("C:\Output.der", "w") 
text_file.write(result) 
text_file.close() 

Jede mögliche Anleitung erscheinen erhalten würde sehr geschätzt werden.

+0

Können Sie ein Eingabebeispiel angeben? – bla

+0

Diese schwarzen Zeichen sehen aus wie Nicht-ASCII-Zeichen (oder ASCII-Steuercodes). Hier ist ein [Diagramm] (http://www.cpptutor.com/imgs/ascii_table.gif), – martineau

+0

Ich habe die ursprüngliche Frage angepasst, um die hexadezimale Zeichenfolge für die gegebenen Ausgabebilder einzuschließen, danke. – MikG

Antwort

2

MikG, ich würde sagen, dass Python genau das getan hat, was Sie angefordert haben.

Sie haben gesagt, die Bytes in Zeichenfolge zu konvertieren und Bytes mit dem höchstwertigen Bit zu ersetzen, das mit Escape-Sequenz (außer für \ xFF char) gesetzt wurde.

Die Zeichen \ x04 (ETB) und \ x1F (US) sind absolut zulässige ASCII-Zeichen (obwohl nicht druckbar), und sie sind mit ihrem literalen Wert codiert.

Zeichen \ xd6 und \ xd0 sind in ASCII unzulässig - sie sind 8 Bit lang. Sie sind codiert mit 4-Buchstaben langen Escape-Sequenz, wie Sie gefragt: "\" (Backslash-Zeichen) und "xd6"/"xd0" Zeichenfolgen

Ich bin nicht gut mit DER, aber angenommen, dass Sie erwarten zu haben rohe 8-Bit-Sequenzen. Hier ist, wie dies erreicht werden könnte:

result = bytearray.fromhex('380c2fd6172cd06d1f30') 

with open("Output.der", "wb") as text_file: 
    text_file.write(result) 

Bitte beachten Sie „wb“ Spezifizierer zu open - es sagt Python binären IO zu tun.

Ich auch with Anweisung verwendet, um sicherzustellen, dass text_file geschlossen ist, was auch immer mit Schreiben passiert.

+0

So nah! Es ist fast da mit Ihrer Lösung, ich vermisse jetzt nur die NUL-Blöcke (ähnlich den schwarzen Blöcken in den Diagrammen), stattdessen erhalte ich ein Leerzeichen in der Ausgabe, wenn ich in Notepad ++ geöffnet habe. NUL kann durch Hinzufügen von 00 in der ursprünglichen Hex-Zeichenfolge hinzugefügt werden. – MikG

+0

@MikG Ich habe keine Probleme mit NUL-Zeichen. –

+0

@MikG Es ist die Funktion eines Texteditors, den Sie verwenden, um die DER-Datei anzuzeigen. Es liest sich bis zum ersten NUL char. Verwenden Sie stattdessen einen Hex-Editor. Oder überprüfen Sie einfach die Größe der Ausgabedatei. Ich versuchte in Linux Python 3.6 - es funktioniert gut. –