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

												

python base64.b64decode 等号可以随便加的更多相关文章

  1. python之~【空格】可不能随便加唷~

    上个礼拜学习从.proto文件转xxpb2.py文件的时候,明明成功了的. 结果周末的时候在家里,以及今天周一来到公司电脑,都遇到同样的一个问题. 我就纳闷了.这个路径确实存在呀. 而且我找遍了搜索引 ...

  2. python base64加解密

    加密字符串 encodestr = base64.b64encode("chenglee1234".encode(encoding='utf-8')) 解密字符串 decodest ...

  3. 最新版-Python和Java实现Aes相互加解密

    前情 需要使用Python和Java实现同一个AES加解密算法,使Python版本加密的密文能够由Java代码解密,反之亦然. Python实现 Python为3.6版本 # -*- coding: ...

  4. python base64的加密与解密

    Base64编码是一种“防君子不防小人”的编码方式.广泛应用于MIME协议,作为电子邮件的传输编码,生成的编码可逆,后一两位可能有“=”,生成的编码都是ascii字符. 优点:速度快,ascii字符, ...

  5. Python Base64转码解码

    Python Base64 提供了好几种方法例如: encode, decode, encodestring, decodestring, b64encode, b64decode, standard ...

  6. Python Base64 编码

    0x00 Base64简介 0x01 常用场景举例 0x02 编.解码流程 0x03 Python中Base64编码与解码 0x00 Base64简介 我们知道在计算机中任何数据都是按ascii码存储 ...

  7. Python base64编码,转图片

    我在做火车票抢票器的时候遇到一个问题,就是验证码提取的:一般验证码都是一些http请求的url,但是火车票网站遇到了我没有见过的以data:image/jpg;base64开头的字符串.现在我们就用P ...

  8. python base64 decode incorrect padding错误解决方法

    个人觉得原因应该是不同的语言/base64库编码规则不太统一的问题. python中base64串的长度需为4的整数倍,故对长度不为4整数倍的base64串需要用"='补足 如下代码: da ...

  9. python base64 编解码,转换成Opencv,PIL.Image图片格式

    二进制打开图片文件,base64编解码,转成Opencv格式: # coding: utf-8 import base64 import numpy as np import cv2 img_file ...

随机推荐

  1. 【Python】【自动化测试】【pytest】

    https://docs.pytest.org/en/latest/getting-started.html#create-your-first-test http://www.testclass.n ...

  2. laravel数据库迁移 和 路由防攻击

    命令:php  artisan  migrate 防攻击:

  3. oracle连接数据库和连接表的操作

    1.连接测试是否连接oracle成功 (1).tnsnames.ora文件配置 oracle65= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCO ...

  4. 页面检测网络外网连接- 网页基础模块(JavaScript)

    方法一 html 添加图片标签 加载外站图片 <img id="connect-test" style="display:none;" onload=&q ...

  5. 修改Anaconda3中jupyter的工作目录

    1.打开Anaconda Prompt,运行jupyter notebook --generate-config 2.找到当前用户下的.jupter文件夹,打开jupyter_notebook_con ...

  6. Angular - - ng-focus、ng-blur

    1.ng-focus 这个指令功能就是比如当一个input等获取到焦点的时候,执行你指定的表达式函数,达到你需要的目的 格式:ng-focus=“value” value:获取焦点时执行的表达式,方法 ...

  7. 【log4j】使用注意事项

    实际过程中,使用log4j遇到的一些问题,进行总结: 1.log4j.properties文件的放置路径: 必须放在src的根目录下,这样就不需要额外的加载了 2.申明一个log对象 Logger l ...

  8. Saiku本地编译运行后Debug调试(十二)

    Saiku源码拉下来在本地编译通过,然后想进行单元测试 发现不知道怎么写测试类了... 幸好有同事大佬的帮助,教了一招哈哈哈哈... 1.将本地编译通过的Saiku打包好(mvn clean inst ...

  9. Oracle物化视图梳理

    --物化视图可以分为三种类型:* 包含聚集的物化视图* 只包含连接的物化视图* 嵌套物化视图三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大. --物化视图创建方式(Build M ...

  10. shell中获取时间

    获得当天的日期 date +%Y-%m-%d 输出: 2011-07-28 将当前日期赋值给DATE变量DATE=$(date +%Y%m%d) 有时候我们需要使用今天之前或者往后的日期,这时可以使用 ...