2016-11-21 7 views
2

Base64を約200 Base64データの16進数にデコードしようとしていますが、このエラーが発生しています。それは60人分のデコードを行い、その後停止します。Base64 Pythonを使用した埋め込みエラーが正しくありません

あなたはどちらかBase64文字列ではありません、あなたのCSVファイル内の少なくとも1つの文字列を持っている
ABHvPdSaxrhjAWA= 
0011ef3dd49ac6b8630160 
ABHPdSaxrhjAWA= 
Traceback (most recent call last): 
    File "tt.py", line 36, in <module> 
    csvlines[0] = csvlines[0].decode("base64").encode("hex") 
    File "C:\Python27\lib\encodings\base64_codec.py", line 43, in base64_decode 
    output = base64.decodestring(input) 
    File "C:\Python27\lib\base64.py", line 325, in decodestring 
    return binascii.a2b_base64(s) 
binascii.Error: Incorrect padding 

CSV

ABHPdSaxrhjAWA= 
ABDPdSaxrhjAWA= 
ABDPdSaxrhjAWA= 
ABDPdSaxrhjAWA= 
ABDPdSaxrhjAWA= 
ABDPdSaxrhjAWA= 
ABDPdS4xriiAVQ= 
ABDPdSqxrizAU4= 
ABDPdSrxrjPAUo= 
+0

エラーはテキストです。そのテキストをコピー&ペーストしてください。スクリーンショットは検索できません。 –

+0

これは、ソーステキストが実際にbase64から来なかったことを意味します。テキストはどこで手に入れましたか?おそらくあなたはカットアンドペーストエラーを起こしましたか? –

+0

@JohnGordon:いいえ、それはまた、詰め物がないことを意味する可能性があります。パディングはデコードには必須ではありませんが、不完全な送信を検出する場合にのみ役立ちます。 –

答えて

3

からいくつかのオリジナルのBase64のソースは、(損傷した)破損したBase64文字列である、またはあります必要な文字列がない場合は=パディング。あなたの例の値ABHPdSaxrhjAWA=は、短いものです=またはには別のデータ文字がありません。その後、

value = csvlines[0] 
if len(value) % 4: 
    # not a multiple of 4, add padding: 
    value += '=' * (4 - len(value) % 4) 
csvlines[0] = value.decode("base64").encode("hex") 

値は、その後まだはデコードに失敗した場合、あなた:

Base64で文字列を、適切にパディングされ、あなたが簡単にパディングを再度追加することができますので、4の倍数である長さを持っています入力が壊れているか、有効ではないBase64が始まっています。例えば、エラーの

ABHPdSaxrhjAWA=、上記のは、それが復号化可能にするために1 =を追加します。

>>> value = 'ABHPdSaxrhjAWA=' 
>>> if len(value) % 4: 
...  # not a multiple of 4, add padding: 
...  value += '=' * (4 - len(value) % 4) 
... 
>>> value 
'ABHPdSaxrhjAWA==' 
>>> value.decode('base64') 
'\x00\x11\xcfu&\xb1\xae\x18\xc0X' 
>>> value.decode('base64').encode('hex') 
'0011cf7526b1ae18c058' 

私はあなたのデータを簡単に壊れている可能性がありますことを強調する必要があります。コンソール出力には、正常に機能した値と失敗した値が含まれています。働い1は1つの文字長く、それが唯一の違いです:

ABHvPdSaxrhjAWA= 
ABHPdSaxrhjAWA= 

注4位でv。これは2番目の例ではありません。これは、CSVデータに何かが起きて、そのキャラクタが2番目の例から削除されたことを示している可能性があります。パディングを追加すると、2番目の値を再びデコード可能にすることができますが、結果はが間違ってになります。これらの2つのオプションのうちのどれが原因であるかはわかりません。

+0

私はすべてのbase64データを調べましたが、=記号が付いています。それは60のそれらをデコードしますが、すべてのデータが同一で​​あるように見えますが、そのエラーが発生します。 – James

+0

@James:しかし、サンプルの文字列は長さが16になるように** ** ** ** =入力データ長に応じて2つのパディング文字を使用できます。 –

+0

それでは、どのようにそれらのうちのいくつかがデコードされて、=文字が1つしかないのですか? – James

関連する問題