2016-11-21 40 views
2

我想解碼Base64到大約200 Base64數據的十六進制,我收到以下錯誤。它解碼60個然後停止。Base64不正確的填充錯誤使用Python

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某些原始的Base64源

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

錯誤仍然是文本;請複製並粘貼該文字,截圖不可搜索。 –

+0

這意味着源文本並非真的來自base64。你從哪裏得到的文字?也許你做了一個粘貼錯誤的錯誤? –

+0

@JohnGordon:不,也可能意味着缺少填充​​。填充對於解碼實際上不是強制性的,它只有在你想檢測不完整的傳輸時纔有用。 –

回答

3

你在你的CSV文件中至少有一個字符串,或者不是一個Base64編碼字符串,是一個已損壞的(損壞)Base64編碼字符串,或者是一個字符串缺少所需的=填充。您的示例值ABHPdSaxrhjAWA=短一個=缺少另一個數據字符。

Base64編碼字符串,正確填充,具有的長度是4的倍數,所以你可以很容易地重新添加填充:

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開始。

對於例如錯誤,ABHPdSaxrhjAWA=,上面增加了一個=,使其解碼:

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

我需要強調的是,您的數據可能只是被破壞。您的控制檯輸出包含一個有效的值,一個失敗。該工作的一個是一個字符長,這就是唯一的區別

ABHvPdSaxrhjAWA= 
ABHPdSaxrhjAWA= 

注意v在第4位;這在第二個例子中是缺失的。這可能表明您的CSV數據發生了某些情況,導致該字符從第二個示例中刪除。添加填充可以使第二個值再次可解碼,但結果將是錯誤。我們不能告訴你這兩個選項中的哪一個是原因。

+0

我只查看了所有的base64數據,它有一個=符號。它解碼了其中的60個,但是即使所有數據看起來都是相同的,我也會得到這個錯誤 – James

+0

@James:但是你的示例字符串應該有** 2 **'='字符來填充長度爲16的字符。Base64字符串有0,1或2個填充字符,具體取決於輸入數據的長度。 –

+0

那麼它是如何解碼其中一些只有一個=字符? – James