python base64.b64decode 等號可以隨便加


由於 =  用在URL,cookie里會造成歧義,所以base64編碼的時候,會把 = 自動去掉。

解碼的時候,如果傳入的二進制編碼長度小於4的倍數,那么需要在后面補=,知道滿足長度等於4的倍數,然后再解碼

請寫一個能處理去掉=的base64解碼函數:

這是我第一次寫的,運行之后並沒有發現什么錯誤:

import base64


def safe_base64_decode(s):
for i in range(len(s) % 4):
s += b'='
return base64.b64decode(s)

# 測試:
assert b'abcd' == safe_base64_decode(b'YWJjZA========'), safe_base64_decode(b'YWJjZA==')
assert b'abcd' == safe_base64_decode(b'YWJjZA'), safe_base64_decode(b'YWJjZA')
assert b'aU' == safe_base64_decode(b'YVU'), safe_base64_decode(b'YVU')
assert b'HHL2' == safe_base64_decode(b'SEhMMg'), safe_base64_decode(b'SEhMMjIy')
assert b'HHL222' == safe_base64_decode(b'SEhMMjIy'), safe_base64_decode(b'YWFLS0w')
assert b'0' == safe_base64_decode(b'MA'), safe_base64_decode(b'MA')
print('ok')

 

 
        

然后我去看了下被人是怎么實現的,發現有很多實現方法,有的和我的一樣,有的不一樣,然后就發現了這個現象:其實后面加多少 = 都沒有關系,

然后我就改成下面這樣,運行后也ok:

import base64


def safe_base64_decode(s):
return base64.b64decode(s + b'=' * 3) # 4的最大余數就是3,所以最多需要補3個

# 測試:
assert b'abcd' == safe_base64_decode(b'YWJjZA========'), safe_base64_decode(b'YWJjZA==')
assert b'abcd' == safe_base64_decode(b'YWJjZA'), safe_base64_decode(b'YWJjZA')
assert b'aU' == safe_base64_decode(b'YVU'), safe_base64_decode(b'YVU')
assert b'HHL2' == safe_base64_decode(b'SEhMMg'), safe_base64_decode(b'SEhMMjIy')
assert b'HHL222' == safe_base64_decode(b'SEhMMjIy'), safe_base64_decode(b'YWFLS0w')
assert b'0' == safe_base64_decode(b'MA'), safe_base64_decode(b'MA')
print('ok')

 

 
       


免責聲明!

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



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