在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中struct模块对字节流/二进制流的操作教程
Jan 21 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
python使用邻接矩阵构造图代码示例
Nov 10 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
利用python如何在前程无忧高效投递简历
May 07 Python
python OpenCV GrabCut使用实例解析
Nov 11 Python
python中如何使用insert函数
Jan 09 Python
python实现贪吃蛇双人大战
Apr 18 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 Python
基于python制作简易版学生信息管理系统
Apr 20 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
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
PHP简单实现欧拉函数Euler功能示例
2017/11/06 PHP
js location.replace与location.reload的区别
2010/09/08 Javascript
一个Action如何调用两个不同的方法
2014/05/22 Javascript
利用原生JavaScript获取元素样式只是获取而已
2014/10/08 Javascript
jquery+easeing实现仿flash的载入动画
2015/03/10 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
Bootstrap框架结合jQuery仿百度换肤功能实例解析
2016/09/17 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
Three.js如何实现雾化效果示例代码
2017/09/27 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
Nuxt.js 数据双向绑定的实现
2019/02/17 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
python3.3教程之模拟百度登陆代码分享
2014/01/16 Python
python写xml文件的操作实例
2014/10/05 Python
python中管道用法入门实例
2015/06/04 Python
Python实现的将文件每一列写入列表功能示例【测试可用】
2018/03/19 Python
Python 实现选择排序的算法步骤
2018/04/22 Python
python3实现基于用户的协同过滤
2018/05/31 Python
Python Pandas批量读取csv文件到dataframe的方法
2018/10/08 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
浅析python内置模块collections
2019/11/15 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
浅析python实现动态规划背包问题
2020/12/31 Python
使用python实现学生信息管理系统
2021/02/25 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
如何写出好的Java代码
2014/04/25 面试题
文秘个人求职信范文
2014/04/22 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
Java获取字符串编码格式实现思路
2022/09/23 Java/Android