在Python中使用base64模块处理字符编码的教程


Posted in Python onApril 28, 2015

Base64是一种用64个字符来表示任意二进制数据的方法。

用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。

Base64的原理很简单,首先,准备一个包含64个字符的数组:

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']

然后,对二进制数据进行处理,每3个字节一组,一共是3x8=24bit,划为4组,每组正好6个bit:

在Python中使用base64模块处理字符编码的教程

这样我们得到4个数字作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。

所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。

如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

Python内置的base64可以直接进行base64的编解码:

>>> import base64
>>> base64.b64encode('binary\x00string')
'YmluYXJ5AHN0cmluZw=='
>>> base64.b64decode('YmluYXJ5AHN0cmluZw==')
'binary\x00string'

由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和_:

>>> base64.b64encode('i\xb7\x1d\xfb\xef\xff')
'abcd++//'
>>> base64.urlsafe_b64encode('i\xb7\x1d\xfb\xef\xff')
'abcd--__'
>>> base64.urlsafe_b64decode('abcd--__')
'i\xb7\x1d\xfb\xef\xff'

还可以自己定义64个字符的排列顺序,这样就可以自定义Base64编码,不过,通常情况下完全没有必要。

Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。

Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。

由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉:

# 标准Base64:
'abcd' -> 'YWJjZA=='
# 自动去掉=:
'abcd' -> 'YWJjZA'

去掉=后怎么解码呢?因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上=把Base64字符串的长度变为4的倍数,就可以正常解码了。

请写一个能处理去掉=的base64解码函数:

>>> base64.b64decode('YWJjZA==')
'abcd'
>>> base64.b64decode('YWJjZA')
Traceback (most recent call last):
 ...
TypeError: Incorrect padding
>>> safe_b64decode('YWJjZA')
'abcd'

小结

Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。

Python 相关文章推荐
python实现simhash算法实例
Apr 25 Python
python使用点操作符访问字典(dict)数据的方法
Mar 16 Python
Python中有趣在__call__函数
Jun 21 Python
Python的re模块正则表达式操作
May 25 Python
利用python画一颗心的方法示例
Jan 31 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
tensorflow 输出权重到csv或txt的实例
Jun 14 Python
对python周期性定时器的示例详解
Feb 19 Python
Python实现UDP程序通信过程图解
May 15 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 Python
python操作xlsx格式文件并读取
Jun 02 Python
使用Python的内建模块collections的教程
Apr 28 #Python
进一步探究Python中的正则表达式
Apr 28 #Python
在Python程序中实现分布式进程的教程
Apr 28 #Python
浅析Python多线程下的变量问题
Apr 28 #Python
python实现向ppt文件里插入新幻灯片页面的方法
Apr 28 #Python
Python实现对PPT文件进行截图操作的方法
Apr 28 #Python
在Python下尝试多线程编程
Apr 28 #Python
You might like
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
php discuz 主题表和回帖表的设计
2009/03/13 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
php多文件打包下载的实例代码
2017/07/12 PHP
Laravel使用原生sql语句并调用的方法
2019/10/09 PHP
laravel 解决强制跳转 https的问题
2019/10/22 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
js离开或刷新页面检测(且兼容FF,IE,Chrome)
2014/03/05 Javascript
QQ空间顶部折页撕开效果示例代码
2014/06/15 Javascript
js控制TR的显示隐藏
2016/03/04 Javascript
Vue.js每天必学之内部响应式原理探究
2016/09/07 Javascript
jquery延迟对象解析
2016/10/26 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
JavaScript实现AOP详解(面向切面编程,装饰者模式)
2017/12/19 Javascript
Angular实现的简单定时器功能示例
2017/12/28 Javascript
layui表格数据重载
2019/07/27 Javascript
JavaScript实现京东放大镜效果
2019/12/03 Javascript
通过实例解析json与jsonp原理及使用方法
2020/09/27 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
Python写的创建文件夹自定义函数mkdir()
2014/08/25 Python
详解Python中的__new__、__init__、__call__三个特殊方法
2016/06/02 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
Python实现繁体中文与简体中文相互转换的方法示例
2018/12/18 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
Weblogc domain问题
2014/01/27 面试题
董事长秘书工作职责
2014/06/10 职场文书
小学校长开学致辞
2015/07/29 职场文书
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server