Python解碼base64遇到Incorrect padding錯誤


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編碼后的文本,會比原文本大出三分之一左右。

http://www.ruanyifeng.com/blog/2008/06/base64.html

如果要編碼的二進制數據不是3的倍數,最后會剩下1個或2個字節怎么辦?Base64用\x00字節在末尾補足后,再在編碼的末尾加上1個或2個=號,表示補了多少字節,解碼的時候,會自動去掉。

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431954588961d6b6f51000ca4279a3415ce14ed9d709000

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編碼,其實就是把字符+/分別變成-_

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431954588961d6b6f51000ca4279a3415ce14ed9d709000

然后,我們這個問題又有另外一個解決方式了:

base64.urlsafe_b64decode(base64_url)


免責聲明!

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



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