2012-07-25 12 views
9

Mam ekstrakcji base64 ciąg ForeColor, struktura i Kontur wartości obrazów, mam listę z następującą strukturą:Decode pyton base64 String

forecolor=AgCEAg4DUQQCBQQGARMBFQE1AmUB 
edge=AfCAFg5iIATCPwTAEIiBFggBDw 
forecolor=AgAsAQ0CJAMcDRgOGg8DHQYeBzYBPQ4-DU0ETgNtBm4CfQI 

próbuję rozszyfrować te wartości, ale jestem coraz Nieprawidłowa błąd wyściółka, tutaj jest dokładna błędu:

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 

Oto mój kod:

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

Widziałem też interesująca się położyć, gdy pierwszy ciąg base64 ForeColor został odkodowany: Oto się umieścić tego:

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

Nie jestem pewien, co robię źle tutaj. Sprawdziłem następujący dokument Pythona i próbowałem, ale to też nie działało: http://docs.python.org/library/base64.html

+0

Wartość 'edge' nie wydaje się być base64 zakodowany ciąg vlaid, więc Python daje komunikat o błędzie. Użyj poprawnych danych wejściowych, a rzeczy powinny działać. –

+0

Jeśli spojrzysz na kod, próbuję tylko dekodować forecolor, więc nie sądzę, aby w tym momencie zadziałało ostrze. –

+0

@SvenMarnach, możesz naprawić problem z dopełnieniem, dodając parę końcówki "==" na końcu łańcucha. Większym problemem jest to, że dekodowany wynik jest całkowicie nie do odczytania. –

Odpowiedz

8

Próbujesz odkodować ciąg Base64, który nie ma dopełnienia. Chociaż wiele smaków Base64 nie ma dopełnienia, Python wymaga dopełnienia dla standardowego dekodowania base64. To pytanie StackOverflow ma wyjaśnienia bardziej szczegółowe: Python: Ignore 'Incorrect padding' error when base64 decoding

Dla kodu chciałbym dokonać modyfikacji podobny do poniżej:

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

Oparte na Twój komentarz wydawało się, że trzeba także tablica bajtów wrócił z dekodowanie base64 zamienione na listę liczb całkowitych. Założyłem, że liczby całkowite to małe endianowe krótkie ints.

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 

Wynik był następujący:

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

Ciągle mam ten sam błąd, użyłem dokładnie linii, którą umieściłeś. –

+1

Znalazłem inną technikę w innej odpowiedzi, która działa dla twoich danych. Zaktualizowałem odpowiedź. Jest to po prostu dodanie wystarczającej ilości padding do uwzględnienia wszystkich scenariuszy. –

+0

Dzięki, ale problemem jest dekodowana wartość powinna być wektorem takim jak 2,3,4,5 zamiast tego, że daje mi napis jak d # CSs padding to problem, że dane są całkowicie błędne. Te zakodowane wartości są generowane przez program C++, który ma coś z tym wspólnego? –