zoukankan      html  css  js  c++  java
  • 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')

    
    
  • 相关阅读:
    第十八周作业
    第十七周作业
    第十六周作业
    第十五周作业
    第十四周作业
    第十三周作业
    第十二周作业
    第二阶段考试
    第十周作业
    启航,带着梦想出发!
  • 原文地址:https://www.cnblogs.com/xiaohai2003ly/p/8678135.html
Copyright © 2011-2022 走看看