Python解碼base64遇到Incorrect padding錯誤
base64轉碼過程
所謂Base64,就是說選出64個字符----小寫字母a-z、大寫字母A-Z、數字0-9、符號"+"、"/"(再加上作為墊字的"=",實際上是65個字符)----作為一個基本字符集。然后,其他所有符號都轉換成這個字符集中的字符。
具體來說,轉換方式可以分為四步。
第一步,將每三個字節作為一組,一共是24個二進制位。
第二步,將這24個二進制位分為四組,每個組有6個二進制位。
第三步,在每組前面加兩個00,擴展成32個二進制位,即四個字節。
第四步,根據下表,得到擴展后的每個字節的對應符號,這就是Base64的編碼值。
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
因為,Base64將三個字節轉化成四個字節,因此Base64編碼后的文本,會比原文本大出三分之一左右。
如果要編碼的二進制數據不是3的倍數,最后會剩下1個或2個字節怎么辦?Base64用
\x00
字節在末尾補足后,再在編碼的末尾加上1個或2個=
號,表示補了多少字節,解碼的時候,會自動去掉。
Incorrect padding錯誤
-
谷歌找到答案 ,說是有可能去掉了編碼后的等號,可以手動加上,解決方式如下:
def decode_base64(data):
"""Decode base64, padding being optional.
:param data: Base64 data as an ASCII byte string
:returns: The decoded byte string.
"""
missing_padding = len(data) % 4
if missing_padding != 0:
data += b'='* (4 - missing_padding)
return base64.decodestring(data)
我試了試,其實還是同樣的錯誤,看來並不是等號的問題。
-
繼續嘗試,又有人說可能是末尾多了字符,可嘗試去掉,方法如下:
lens = len(strg)
lenx = lens - (lens % 4 if lens % 4 else 4)
try:
result = base64.decodestring(strg[:lenx])
except etc
我又試了試,還是不行~看來也不是這個問題
-
再往下看,看到了這個
Update 2: It is possible that the encoding has been done in an url-safe manner. If this is the case, you will be able to see minus and underscore characters in your data, and you should be able to decode it by using
base64.b64decode(strg, '-_')
意思是如果你解碼的是url(咦,我就是處理url),可以這么嘗試
base64.b64decode(strg, '-_')
試了一下,然也。
-
那么為什么會出現這種情況呢?繼續查看原因,終於找到了:
由於標准的Base64編碼后可能出現字符
+
和/
,在URL中就不能直接作為參數,所以又有一種"url safe"的base64編碼,其實就是把字符+
和/
分別變成-
和_
:
然后,我們這個問題又有另外一個解決方式了:
base64.urlsafe_b64decode(base64_url)