python3 base64解碼出現TypeError:Incorrect padding
阿新 • • 發佈:2018-06-18
個數 整除 報錯 ssi 16px pre 2個 color odi
今天在解決爬蟲對加密參數的分析時,需要使用到base64解碼。但是過程中出現了TypeError:Incorrect padding的錯誤提示。以下是解決方法,以便查閱。
其實正常使用base64是不會出現問題的,就比如下面的代碼。
1 #!usr/bin/env python 2 # coding:utf-8 3 4 import base64 5 6 a = b‘hello‘ 7 b = base64.b64encode(a) 8 # 對a進行base64編碼 9 print(b) # b‘aGVsbG8=‘ 10 # 對b進行base64解碼,也就是把a編碼過的內容解碼11 c = base64.b64decode(b) 12 print(c) # b‘hello‘
上面代碼的編碼結果是完整的,所以直接解碼出來沒有問題。如果編碼結果不完整,比如上面代碼中如果給定的bytes對象的值是b‘aGVsbG8‘ ,就會出現TypeError:Incorrect padding異常提示。比如下面的代碼就報錯了。
#!usr/bin/env python # coding:utf-8 import base64 a = b‘aGVsbG8‘ b = base64.b64decode(a) print(b) #binascii.Error: Incorrect padding
解決方法如下:
1 #!usr/bin/env python 2 # coding:utf-8 3 4 import base64 5 6 a = b‘aGVsbG8‘ 7 missing_padding = 4 - len(a) % 4 8 if missing_padding: 9 a += b‘=‘ * missing_padding 10 b = base64.b64decode(a) 11 print(b) # b‘hello‘
這樣問題就解決了,其實就是在後面加等號。而missing_padding計算的就是等號的個數。如果你算出了=號的數量,直接加=號也是可以的。比如下面的代碼:
1 #!usr/bin/env python 2 # coding:utf-8 3 4 import base64 5 import chardet 6 7 a = b‘aGVsbG8‘ 8 c = base64.b64decode(a + b‘=‘) 9 print(c) # b‘hello‘
至於計算是怎麽來的,需要了解下base64的原理。用一個等式表示就是,3x8 = 4x6,也就是,以前能存3字節的,現在能存4字節,只不過把原先的位bit進行了分割,而且每一個字節是用6位來表示。因為分割後的每一個字節只有6位了,不足的兩位就以0來填充。而且這4個字節可以看做是一個整體,base64解碼後的bytes長度至少為4且為4的倍數,不足部位以‘=’填充。
聽的很迷糊?其實是我表達的不好,而且懶得畫圖。還是看代碼:
1 #!usr/bin/env python 2 # coding:utf-8 3 4 import base64 5 6 # 原始1x8 =8位 7 a = b‘h‘ 8 # base64編碼後 8 / 6 = 1 余2,所以至少需要2個字節位,為了滿足能被4整除,需要補充兩個=號 9 b = base64.b64encode(a) 10 print(b) # b‘aA==‘ 11 12 # 把編碼後的結果處理一下,去掉‘=’號 13 c = b.decode(‘utf-8‘).rstrip(‘=‘) 14 # 對結果進行解碼,前面已經算出需要2個=號了,直接加上就好 15 d = base64.b64decode(c.encode(‘utf-8‘) + b‘=‘ * 2) 16 # 還原結果 17 print(d) # b‘h‘
這樣就一目了然了,關於base64引發異常總結就到這裏。
python3 base64解碼出現TypeError:Incorrect padding