由於 = 用在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')