2016-10-18 4 views
0

Wenn ich laufe:Verschiedene Ausgänge nach dekodieren und codieren Daten (base64)

import base64 
data = open('1.dat', 'rb').read() 
decoded = base64.b64decode(data) 
encoded = base64.b64encode(decoded) 
data == encoded 

I "False" als Ergebnis zu erhalten? Wie dekodiert/encodiert, um das ursprüngliche Ergebnis zu erhalten?

+0

in meiner Datei „1.dat“ ist eine Base64-codierte Zeichenfolge – spitzbuaamy

+0

Es ist etwas Flexibilität in der Art wie base64 kodiert ist, zum Beispiel das Einfügen von Zeilenumbrüchen. Es gibt keine Anforderung oder Erwartung, dass zwei Kodierungen identisch sein werden. –

+0

Versuchen Sie mit 'data.strip()' – mk2

Antwort

1

Base64 ist leider nicht base64. Es kann Unterschiede in den Implementierungen geben. Einige Implementierungen zum Beispiel Zeilenumbrüche brechen beim Codieren alle 76 Zeichen ab, andere nicht.

0

Sie haben die Daten b64encode() bevor Sie b64decode() es:

>>> import base64 
>>> data = b"qwertzuiop" 
>>> encoded = base64.b64encode(data) 
>>> decoded = base64.b64decode(encoded) 
>>> data == decoded 
True 

Wenn Ihre Eingabedatei bereits base64 ist, Sie zu b64decode() müssen sie zuerst, nicht kodieren. So sollte der Code sein:

import base64 
data = open('1.dat', 'rb').read() # base64 encoded string 
decoded = base64.b64decode(data) 
encoded = base64.b64encode(decoded) 
data == encoded 

Wenn Sie falsch als Ergebnis bekommen, Ihre data ist Base64 codiert anders als das, was das base64 Modul tut.

+0

meine Datei "1.dat" ist Base64-codiert – spitzbuaamy

+0

@spitzbuaamy Dann bedeutet es, dass die Base64 in Ihrer 1.dat unterscheidet sich von dem, dass die 'base64'-Modul in Python verwendet. Wie hast du die 1.dat-Datei erstellt? – Dartmouth

0

Die Codierung von base64 ist etwas flexibel, z. B. das Einfügen von Zeilenumbrüchen. Es kann auch einige alternative Zeichen geben, die Sie beim Codieren und Decodieren mit base64 module angeben können. Es liegt an Ihnen, um sicherzustellen, dass die richtigen alternativen Zeichen angegeben werden, aber ansonsten ist es einfach, zwei Strings zu vergleichen, während alle Zeilenumbrüche oder Leerzeichen ignorieren:

''.join(data.split()) == ''.join(encoded.split()) 
Verwandte Themen