Hallo,
ich habe ein Problem mit dem Modul base64.
Ich schreibe gearade ein Bas64-De- und Encoding-Programm. Das ganze soll noch etwas mehr tun aber das hat nichts mit dem Problem zu tun.
Zu Übungszwecken schreibe ich das ganze in C# UND in Python.
Nun habe ich gemerkt, dass die Encodings nicht gleich sind.
base64 haut mir nach allen 76 Teichen einen Zeilenumbruch in die Ausgabe.
nehme ich die Zeichenkette (ohne ""):
"www.python.org - www.python.org - www.python.org"
kommt raus:
d3d3LnB5dGhvbi5vcmcgLSB3d3cucHl0aG9uLm9yZyAtIHd3dy5weXRob24ub3Jn
Bei .Net ohne und bei Python mit abschließenden Zeilenvorschub
bei einer längeren Zeichenkette (ohne "")
"www.python.org - www.python.org - www.python.org - www.python.org"
kommt bei .Net:
d3d3LnB5dGhvbi5vcmcgLSB3d3cucHl0aG9uLm9yZyAtIHd3dy5weXRob24ub3JnIC0gd3d3LnB5dGhvbi5vcmc=
und bei Python:
d3d3LnB5dGhvbi5vcmcgLSB3d3cucHl0aG9uLm9yZyAtIHd3dy5weXRob24ub3JnIC0gd3d3LnB5
dGhvbi5vcmc=
raus, was ausser dem Zeilenvorschub noch gleich ist.
Wenn aber auch noch Zeilenvorschübe im Original drin sind, läuft es vollkommen auseinander.
So wird die Zeichenkette (ohne ""):
"www.python.org -
www.python.org -
www.python.org"
unter .Net zu:
d3d3LnB5dGhvbi5vcmcgLSANCnd3dy5weXRob24ub3JnIC0gDQp3d3cucHl0aG9uLm9yZw==
und unter Python zu:
d3d3LnB5dGhvbi5vcmcgLSAKd3d3LnB5dGhvbi5vcmcgLSAKd3d3LnB5dGhvbi5vcmc=
Hier stimmen ab de4 24. Stelle nicht mal mehr die Zeichen überein.
Decodiere ich diesen Output mit der Umkehrung des Erzeugungsweges (.NET hin und zurück bzw. Python hin und zurück) kommt das Richtige raus.
Nehme ich aber z.B. den .Net-Encode-Output vom 3. Fall und dekodiere mit Python bekomme ich:
"www.python.org -
www.python.org -
www.python.org"
Decodiere ich den Python-Encode-Output des 3. Falles mit .NET bekomme ich das korrekte Ergebnis:
"www.python.org -
www.python.org -
www.python.org"
Kann ich da noch was einstellen? Woher kommen die Unterschiede?
Vielen Dank
Dirk
[erledigt] Base64 Problem
Wie liest Du die Daten ein? Öffnest Du die Datei in Python auch im Binärmodus, damit Windows nichts an den Daten, insbesondere den Zeilenumbrüchen verändert?
Paste doch einfach mal ein Minimalbeispiel für C# und Python, welches unterschiedliche Ausgaben produziert.
Danke,
das 'rb' statt 'r' war die Lösung des 3. Problems
Nun muss ich nur noch den 2. Fall abfangen.
Ich habe eine Steuerdatei welche aus einer Zeile base64 Text besteht.
Diese soll decodiert, formatiert (Zeilenumbrüche für Lesbarkeit), editiert, rückformatiert (Zeilenumbrüche raus), encodiert und wieder geschrieben werden.
Ich habe bisher sowohl:
als auch:
versucht.
Schon der Outputstring des 2. Schnipsels bricht nach 76 Zeichen um.
Da ich nicht weiss, was passiert, wenn die Steuerdatei auf einmal Zeilenumbrüche hat, will/muss ich alles in eine Zeile bekommen.
Hat da Jemand noch 'nen Tip?
Danke für die bisherige Hilfe
Dirk
das 'rb' statt 'r' war die Lösung des 3. Problems
Nun muss ich nur noch den 2. Fall abfangen.
Ich habe eine Steuerdatei welche aus einer Zeile base64 Text besteht.
Diese soll decodiert, formatiert (Zeilenumbrüche für Lesbarkeit), editiert, rückformatiert (Zeilenumbrüche raus), encodiert und wieder geschrieben werden.
Ich habe bisher sowohl:
Code: Alles auswählen
base64.encode(open(inputname, 'rb'), open(outputname, 'wb'))
Code: Alles auswählen
inputdatei = open(inputname,'rb')
inputstring = inputdatei.read()
inputdatei.close()
outputstring = base64.encodestring(inputstring)
outputdatei = open(outputname, 'wb')
outputdatei.write(outputstring)
outputdatei.close()
Schon der Outputstring des 2. Schnipsels bricht nach 76 Zeichen um.
Da ich nicht weiss, was passiert, wenn die Steuerdatei auf einmal Zeilenumbrüche hat, will/muss ich alles in eine Zeile bekommen.
Hat da Jemand noch 'nen Tip?
Danke für die bisherige Hilfe
Dirk
Du solltest damit klar kommen, in base64-kodierten Texten Leerzeichen und Zeilenumbrüche zu überlesen. Sie werden von einigen Encodern eingefügt, weil das MIME content-transfer-encoding, wo base64 das erster Mal bekannt geworden ist, erfordert, dass nach 76 Zeichen ein Zeilenumbruch kommt.
Der aktuelle RFC sagt hingegen, man soll diese Zeilenumbrüche nur benutzen, wenn sie auch (wie bei MIME) notwendig sind, sonst aber weglassen. Das haben aber wohl noch nicht alle Encoder gelesen.
Stefan
Der aktuelle RFC sagt hingegen, man soll diese Zeilenumbrüche nur benutzen, wenn sie auch (wie bei MIME) notwendig sind, sonst aber weglassen. Das haben aber wohl noch nicht alle Encoder gelesen.
Stefan
Das base64 Modul ist definitiv kompatibel zum RFC, irgendwie scheint hier nur niemand die Doku zu lesen.sma hat geschrieben:Der aktuelle RFC sagt hingegen, man soll diese Zeilenumbrüche nur benutzen, wenn sie auch (wie bei MIME) notwendig sind, sonst aber weglassen. Das haben aber wohl noch nicht alle Encoder gelesen.
Die Doku erwähnt explizit, dass mehrere Zeilen zurück gegeben werden können. Nun frage ich mich, wieso man dem Modul nun die Schuld gibt, wenn es sich verhält, wie in der Doku beschrieben.encodestring hat geschrieben:Encode the string s, which can contain arbitrary binary data, and return a string containing one or more lines of base64-encoded data. encodestring() returns a string containing one or more lines of base64-encoded data always including an extra trailing newline ('\n').
Im Übrigen existiert die Funktion "base64.b64encode", die keine Zeilenumbrüche erzeugt:
Code: Alles auswählen
[10]--> print b64encode('a'*70)
YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQ==
[11]--> print encodestring('a'*70)
YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh
YWFhYWFhYWFhYWFhYQ==
Vielen Dank für die Hilfe. Das War des Rätsels Lösung.
Doku lesen.... doch tu ich.
Aber wer lesen kann ist klar im Vorteil.
Die ich benutzt hatte hieß:
"12.12 base64 -- Encode and decode MIME base64 data" und erklärt, warum ich so in die Irre gegangen bin.
ABER
Nix für Ungut,
Vielen Dank an alle die geholfen haben
Dirk
Doku lesen.... doch tu ich.
Aber wer lesen kann ist klar im Vorteil.
Die ich benutzt hatte hieß:
"12.12 base64 -- Encode and decode MIME base64 data" und erklärt, warum ich so in die Irre gegangen bin.
ABER
Tut keiner, ich habe nicht gefragt: Was macht das Modul falsch, sondern:Nun frage ich mich, wieso man dem Modul nun die Schuld gibt, wenn es sich verhält, wie in der Doku beschrieben.
Ich habe also durchaus den Fehler bei mir gesucht, bin nur nicht auf die Idee gekommen, dass ich für mein Problem die falsche Doku zu Rate ziehe.Kann ich da noch was einstellen? Woher kommen die Unterschiede?
Nix für Ungut,
Vielen Dank an alle die geholfen haben
Dirk
Zuletzt geändert von dila71 am Samstag 12. Juli 2008, 15:11, insgesamt 1-mal geändert.
Von welcher Doku sprichst du?dila71 hat geschrieben:"12.12 base64 -- Encode and decode MIME base64 data" und erklärt, warum ich so in die Irre gegangen bin.
Ich weiß, meine Kommentare waren auch weniger auf dich gezielt als auf meinen Vorposter.ABERTut keiner, ich habe nicht gefragt: Was macht das Modul falsch, sondern:Nun frage ich mich, wieso man dem Modul nun die Schuld gibt, wenn es sich verhält, wie in der Doku beschrieben.Ich habe also Durchaus den Fehler bei mir gesucht, bin nur nicht auf die Idee gekommen, dass ich für mein Problem die falsche Doku zu Rate ziehe.Kann ich da noch was einstellen? Woher kommen die Unterschiede?
12.12 base64 -- Encode and decode MIME base64 data
zu finden unter: http://www.python.org/doc/2.2.1/lib/module-base64.html
und da gibt es eben genau die 4 Methoden:
* decode
* decodestring
* encode
* encodestring.
Falsche Doku -> falsches Ergebnis.
Ich war nicht über python.org sondern über google hin gekommen.
Dadurch hatte ich http://www.python.org/doc/2.2.1/lib/module-base64.html vor http://docs.python.org/lib/module-base64.html gefunden und verwendet.
zu finden unter: http://www.python.org/doc/2.2.1/lib/module-base64.html
und da gibt es eben genau die 4 Methoden:
* decode
* decodestring
* encode
* encodestring.
Falsche Doku -> falsches Ergebnis.
Ich war nicht über python.org sondern über google hin gekommen.
Dadurch hatte ich http://www.python.org/doc/2.2.1/lib/module-base64.html vor http://docs.python.org/lib/module-base64.html gefunden und verwendet.
-
- Python-Forum Veteran
- Beiträge: 16025
- Registriert: Freitag 20. Juni 2003, 16:30
- Kontaktdaten:
Also wenn du dir die URL angeschaut hättest, dann würde dir vielleicht aufgefallen sein, dass du eine Uralt-Version hast, vgl. http://www.python.org/doc/2.5.2/lib/module-base64.htmldila71 hat geschrieben:12.12 base64 -- Encode and decode MIME base64 data
zu finden unter: http://www.python.org/doc/2.2.1/lib/module-base64.html
2.2.1 war aktuell als ich mit Python angefangen habe (nicht ganz wahr - es war eigentlich 2.2.2) und das ist nun inzwischen einige Jährchen her.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice