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')

    
    
  • 相关阅读:
    flex 遍历Object或者JSON对象内容的实现代码
    Flex Vector使用(转)
    Flex——Array,ArrayCollection,Vector性能比较(转)
    SQLSERVER远程备份、恢复(转)
    隐藏Jquery dialog 按钮
    GSM 短信相关AT指令(转)
    SQL Server 父子迭代查询语句,树状查询(转)
    js framework comparation
    eventEmitter
    调试 shell script 方法
  • 原文地址:https://www.cnblogs.com/xiaohai2003ly/p/8678135.html
Copyright © 2011-2022 走看看