2012-07-25 17 views
9

he extraído cadena de base 64 de los valores ForeColor, la textura y el mapa de bordes de imágenes, tengo una lista con estructura siguiente:Decode pitón base 64 Cadena

forecolor=AgCEAg4DUQQCBQQGARMBFQE1AmUB 
edge=AfCAFg5iIATCPwTAEIiBFggBDw 
forecolor=AgAsAQ0CJAMcDRgOGg8DHQYeBzYBPQ4-DU0ETgNtBm4CfQI 

Estoy intentando decodificar estos valores, pero me estoy haciendo incorrecta error de relleno, aquí es el error exacto:

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 

aquí está mi código:

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

también vi una interesante poner a cabo cuando consiguió decodifica la cadena base64 primer color de primer plano: Aquí está el cabo de ese puesto:

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

No estoy realmente seguro de lo que estoy haciendo mal aquí. Miré el siguiente documento de Python y lo intenté, pero eso tampoco funcionó: http://docs.python.org/library/base64.html

+0

El valor de 'edge' no parece ser una cadena codificado en base 64 vlaid, lo que Python da un mensaje de error. Use entradas válidas, y las cosas deberían funcionar. –

+0

Si miras el código, solo estoy intentando decodificar forecolor, así que no creo que edge entre en acción en este momento. –

+0

@SvenMarnach, puede solucionar el problema de relleno agregando un par de '==' al final de la cadena. El problema más grande es que el resultado descifrado es totalmente indescifrable. –

Respuesta

8

Está intentando decodificar una Base64 String que no tiene relleno. Aunque muchos de los sabores de Base64 no tienen relleno, Python requiere relleno para la decodificación base64 estándar. Esta pregunta StackOverflow tiene una explicación más en profundidad: Python: Ignore 'Incorrect padding' error when base64 decoding

Para su código me gustaría hacer modificaciones similares a continuación:

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

Basado en su comentario parecía que también necesita la matriz de bytes devuelto por el La decodificación base64 se convirtió en una lista de enteros. Hice una suposición de que los enteros son pequeños enteros cortos endian.

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 

El resultado fue:

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

Todavía recibo el mismo error, utilicé la línea exacta que había puesto. –

+1

Encontré otra técnica en otra respuesta que funciona para sus datos. He actualizado la respuesta. Simplemente está agregando suficiente relleno para tener en cuenta todos los escenarios. –

+0

Gracias pero el problema es que el valor decodificado debe ser un vector como 2,3,4,5 en su lugar me da cadena como d # CSs el problema de relleno es resolver los datos es completamente incorrecto. Estos valores codificados son generados por un programa C++ ¿tiene algo que ver con esto? –