2012-07-25 90 views
9

我已經提取的圖像的前景色,質地和edgemap值的base64字符串,我有以下結構的列表:解碼蟒蛇的base64字符串

forecolor=AgCEAg4DUQQCBQQGARMBFQE1AmUB 
edge=AfCAFg5iIATCPwTAEIiBFggBDw 
forecolor=AgAsAQ0CJAMcDRgOGg8DHQYeBzYBPQ4-DU0ETgNtBm4CfQI 

我想這些值進行解碼,但我得到不正確的填充錯誤,這裏是確切的錯誤:

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 

這裏是我的代碼:

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

我也看到了一個有趣出來的時候,第一前景色的base64字符串解碼得到了放: 這裏是放出來的是:

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

我真的不知道我在做什麼錯在這裏。我看了下面的python文件,並嘗試過,但那也沒有工作: http://docs.python.org/library/base64.html

+0

用於'值edge'似乎並不成爲一個vlaid base64編碼串,所以Python給出一個錯誤信息。使用有效的輸入,事情應該工作。 – 2012-07-25 18:24:42

+0

如果你看看代碼,我只是試圖解碼forecolor,所以我不認爲邊緣在這一點上起作用。 – 2012-07-25 18:30:15

+0

@SvenMarnach,你可以通過在字符串的末尾添加幾個'=='來解決填充問題。更大的問題是解碼的結果是完全無法解讀的。 – 2012-07-25 18:30:16

回答

8

您試圖解碼沒有填充的Base64字符串。雖然許多Base64沒有填充,但Python需要填充標準base64解碼。這個StackOverflow的問題有一個更深入的解釋:Python: Ignore 'Incorrect padding' error when base64 decoding

爲您的代碼我會做修改,類似下面:

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

基於您的評論似乎你還需要字節數組從返回base64解碼變成了一個整數列表。我假設這些整數是小尾數短整數。

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 

其結果是:

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

我仍然得到相同的錯誤,我使用了你放的確切線。 – 2012-07-25 23:29:25

+1

我在另一個適用於您的數據的答案中找到了另一種技術。我已經更新了答案。它只是添加足夠的填充來解決所有情況。 – 2012-07-26 01:03:43

+0

謝謝,但問題是解碼值應該是一個像2,3,4,5而不是它給我像d#CSs填充字符串的向量是解決數據是完全錯誤的。這些編碼值是由C++程序生成的,你是否與此有關? – 2012-07-26 01:49:38