2012-07-25 34 views
9

ich base64 Reihe von forecolor, Textur und edgemap Werte von Bildern extrahiert habe, habe ich eine Liste mit folgenden Struktur:Decode Python base64 String

forecolor=AgCEAg4DUQQCBQQGARMBFQE1AmUB 
edge=AfCAFg5iIATCPwTAEIiBFggBDw 
forecolor=AgAsAQ0CJAMcDRgOGg8DHQYeBzYBPQ4-DU0ETgNtBm4CfQI 

Ich versuche, diese Werte zu entschlüsseln, aber ich bin immer falsch padding Fehler, hier sind die genauen Fehler:

Traceback (most recent call last): 
    File "ImageVectorData.py", line 44, in <module> 
    print "Decoded String: " + decoded.decode('base64', 'strict') 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/base64_codec.py", line 42, in base64_decode 
    output = base64.decodestring(input) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/base64.py", line 321, in decodestring 
    return binascii.a2b_base64(s) 
binascii.Error: Incorrect padding 

hier ist mein Code:

for item in value: 
    print "String before Split: " + item 
    if item.split("=")[0] == "forecolor": 
     decoded = (item.split("=")[1]) 
     print "String to be decoded: " + decoded 
     print "Decoded String: " + decoded.decode('base64', 'strict') 

Ich sah auch eine interessantes löscht, wenn die erste forecolor Base64 Zeichenfolge decodiert wurde: Hier wird die aus ist, dass setzen:

String before Split: forecolor=AgCEAg4DUQQCBQQGARMBFQE1AmUB 
String to be decoded: AgCEAg4DUQQCBQQGARMBFQE1AmUB 
Decoded String: ?Q5e 

Ich bin nicht wirklich sicher, was ich falsch hier tue. Ich schaute auf folgendes Python-Dokument und versuchte das, aber das hat auch nicht funktioniert:

+0

Der Wert für 'edge' scheint kein vlaid Base64-codierte Zeichenfolge zu sein, so dass Python eine Fehlermeldung gibt. Verwenden Sie gültige Eingaben, und die Dinge sollten funktionieren. –

+0

Wenn Sie den Code anschauen ich nur versuchen, so zu entschlüsseln forecolor Ich glaube nicht Kante an dieser Stelle in der Tat kommt. –

+0

@SvenMarnach, können Sie das padding Problem beheben, indem Sie ein paar '==' bis zum Ende des Strings hinzugefügt wird. Das größere Problem ist, dass das dekodierte Ergebnis völlig entschlüsselbar ist. –

Antwort

8

Sie versuchen, eine Base64-Zeichenfolge zu decodieren, die keine Auffüllung hat. Obwohl viele Varianten von Base64 kein Padding haben, benötigt Python Padding für die Standard-base64-Decodierung. Diese Frage Stackoverflow hat eine tiefer gehende Erklärung: Python: Ignore 'Incorrect padding' error when base64 decoding

Für Ihren Code würde ich Modifikationen ähnlich wie unten machen:

for item in value: 
    print "String before Split: " + item 
    if item.split("=")[0] == "forecolor": 
     decoded = (item.split("=")[1]) 
     print "String to be decoded: " + decoded 
     # Add Padding if needed 
     decoded += "===" # Add extra padding if needed 
     print "Decoded String: " + decoded.decode('base64', 'strict') 

Basierend auf Ihren Kommentar schien es, dass Sie auch die Byte-Array müssen aus der zurück Die base64-Decodierung wurde in eine Liste von Ganzzahlen umgewandelt. Ich habe eine Annahme gemacht, dass die ganzen Zahlen kleine Endian-Short-Ints sind.

import struct 
x = "AgAsAQ0CJAMcDRgOGg8DHQYeBzYBPQ4-DU0ETgNtBm4CfQI" 
x += "===" 
y = x.decode('base64', 'strict') 
intList = [struct.unpack('<h', y[i] + y[i+1]) for i in xrange(0, len(y), 2)] 
print intList 

Das Ergebnis war:

[(2,), (300,), (525,), (804,), (3356,), (3608,), (3866,), (7427,), (7686,), (13831,), (15617,), (782,), (16723,), (-32749,), (16859,), (-32613,), (16543,)] 
+0

Ich bekomme immer noch den gleichen Fehler, ich benutzte die genaue Zeile, die Sie gesetzt hatten. –

+1

Ich habe eine andere Technik in einer anderen Antwort gefunden, die für Ihre Daten funktioniert. Ich habe die Antwort aktualisiert. Es wird einfach genug Padding hinzugefügt, um alle Szenarien zu berücksichtigen. –

+0

Danke, aber das Problem ist, decodiert Wert sollte wie d # CSs padding Problem ein Vektor wie 2,3,4,5 statt dessen gibt mir String ist lösen die Daten vollständig falsch ist. Diese codierten Werte werden von einem C++ - Programm erzeugt, haben Sie etwas damit zu tun? –