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

    
    
  • 相关阅读:
    数据结构笔记
    并查集
    计算两个数的最大公约数和最小公倍数
    行盒
    浏览器兼容性和布局
    Java中HashMap等的实现要点浅析
    关于js异步上传文件
    填充路径时所使用的 “非零环绕规则”
    XP极限编程
    假如森林里有一棵树倒下了
  • 原文地址:https://www.cnblogs.com/xiaohai2003ly/p/8678135.html
Copyright © 2011-2022 走看看