2012-07-25 14 views
9

ho estratto stringa base64 di valori ForeColor, consistenza e edgemap di immagini, ho una lista con seguente struttura:Decode pitone Base64 String

forecolor=AgCEAg4DUQQCBQQGARMBFQE1AmUB 
edge=AfCAFg5iIATCPwTAEIiBFggBDw 
forecolor=AgAsAQ0CJAMcDRgOGg8DHQYeBzYBPQ4-DU0ETgNtBm4CfQI 

sto cercando di decodificare questi valori, ma io sono sempre corretto errore di imbottitura, qui è l'errore esatto:

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 

Ecco il mio codice:

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

Ho visto anche un interessante mettere fuori quando la stringa base64 prima forecolor ottenuto decodificato: Ecco la fuori messo di che:

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

io non sono davvero sicuro di quello che sto facendo male qui. Ho esaminato il seguente documento Python e l'ho provato, ma non ha funzionato neanche: http://docs.python.org/library/base64.html

+0

Il valore per 'edge' non sembra essere una stringa con codifica Base64 vlaid, quindi Python dà un messaggio di errore. Utilizza input validi e le cose dovrebbero funzionare. –

+0

Se si guarda il codice, sto solo provando a decodificare forecolor, quindi non penso che Edge entri in azione a questo punto. –

+0

@SvenMarnach, puoi risolvere il problema del padding aggiungendo un paio di '==' alla fine della stringa. Il problema più grande è che il risultato decodificato è totalmente indecifrabile. –

risposta

8

Si sta tentando di decodificare una stringa Base64 che non ha padding. Sebbene molti tipi di Base64 non abbiano padding, Python richiede il padding per la decodifica base64 standard. Questa domanda StackOverflow ha una spiegazione più approfondita: Python: Ignore 'Incorrect padding' error when base64 decoding

Per il codice che vorrei fare modifiche simili al di sotto:

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

Sulla base della sua commento sembrava che è necessario anche l'array di byte restituito dal decodifica base64 trasformata in una lista di numeri interi. Ho ipotizzato che i numeri interi siano di breve durata.

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 

Il risultato è stato:

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

Ho ancora lo stesso errore, ho usato la linea esatta che hai inserito. –

+1

Ho trovato un'altra tecnica in un'altra risposta che funziona per i tuoi dati. Ho aggiornato la risposta. Si tratta semplicemente di aggiungere abbastanza padding per tenere conto di tutti gli scenari. –

+0

Grazie, ma il problema è il valore decodificato dovrebbe essere un vettore come 2,3,4,5, invece il suo problema di riempimento come d # CSs pad è la risoluzione dei dati è completamente sbagliato. Questi valori codificati sono generati da un programma C++. Hai qualcosa a che fare con questo? –