[erledigt] Base64 Problem

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
dila71
User
Beiträge: 6
Registriert: Freitag 11. Juli 2008, 14:55

[erledigt] Base64 Problem

Beitragvon dila71 » Freitag 11. Juli 2008, 16:50

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
Zuletzt geändert von dila71 am Samstag 12. Juli 2008, 13:22, insgesamt 1-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Beitragvon Darii » Freitag 11. Juli 2008, 18:11

3. Fall: .NET Zeilenumbruch \r\n, Python \n Verwendest du das auch auf dem gleichen System?
dila71
User
Beiträge: 6
Registriert: Freitag 11. Juli 2008, 14:55

Beitragvon dila71 » Freitag 11. Juli 2008, 18:27

Ja beides auf der gleichen Vistakiste, beides nicht nur auf gleiche sondern auf die identischen Ausgangsdateien angewendet.
BlackJack

Beitragvon BlackJack » Freitag 11. Juli 2008, 21:58

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?
lunar

Beitragvon lunar » Samstag 12. Juli 2008, 11:22

Paste doch einfach mal ein Minimalbeispiel für C# und Python, welches unterschiedliche Ausgaben produziert.
dila71
User
Beiträge: 6
Registriert: Freitag 11. Juli 2008, 14:55

Beitragvon dila71 » Samstag 12. Juli 2008, 11:28

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:

Code: Alles auswählen

base64.encode(open(inputname, 'rb'), open(outputname, 'wb'))

als auch:

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()

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Beitragvon sma » Samstag 12. Juli 2008, 11:58

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
lunar

Beitragvon lunar » Samstag 12. Juli 2008, 12:47

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.

Das base64 Modul ist definitiv kompatibel zum RFC, irgendwie scheint hier nur niemand die Doku zu lesen.
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').

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.

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==
dila71
User
Beiträge: 6
Registriert: Freitag 11. Juli 2008, 14:55

Beitragvon dila71 » Samstag 12. Juli 2008, 13:21

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
Nun frage ich mich, wieso man dem Modul nun die Schuld gibt, wenn es sich verhält, wie in der Doku beschrieben.

Tut keiner, ich habe nicht gefragt: Was macht das Modul falsch, sondern:
Kann ich da noch was einstellen? Woher kommen die Unterschiede?

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.

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.
lunar

Beitragvon lunar » Samstag 12. Juli 2008, 13:30

dila71 hat geschrieben:"12.12 base64 -- Encode and decode MIME base64 data" und erklärt, warum ich so in die Irre gegangen bin.

Von welcher Doku sprichst du?

ABER
Nun frage ich mich, wieso man dem Modul nun die Schuld gibt, wenn es sich verhält, wie in der Doku beschrieben.

Tut keiner, ich habe nicht gefragt: Was macht das Modul falsch, sondern:
Kann ich da noch was einstellen? Woher kommen die Unterschiede?

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.

Ich weiß, meine Kommentare waren auch weniger auf dich gezielt als auf meinen Vorposter.
dila71
User
Beiträge: 6
Registriert: Freitag 11. Juli 2008, 14:55

Beitragvon dila71 » Samstag 12. Juli 2008, 15:10

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Sonntag 13. Juli 2008, 21:51

dila71 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

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.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 Modvoice
dila71
User
Beiträge: 6
Registriert: Freitag 11. Juli 2008, 14:55

Beitragvon dila71 » Montag 14. Juli 2008, 08:11

dila71 hat geschrieben:Ich war nicht über python.org sondern über google hin gekommen.


Hätte ich es umgekehrt gemacht, wäre ich sicher auch gleich bei der aktuellen Doku gelandet... Asche auf mein Haupt :?

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder