10

画像のフォアカラー、テクスチャ、エッジマップ値の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

4

1 に答える 1

8

パディングのないBase64文字列をデコードしようとしています。Base64の多くのフレーバーにはパディングがありませんが、Pythonでは標準のbase64デコードにパディングが必要です。このStackOverflowの質問には、より詳細な説明があります。Python:base64デコード時に「不正なパディング」エラーを無視する

あなたのコードについては、以下のような変更を加えます。

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,)]
于 2012-07-25T19:46:42.463 に答える