python3 base64解碼出現TypeError:Incorrect padding


      今天在解決爬蟲對加密參數的分析時,需要使用到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引發異常總結就到這里。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM