在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 isinstance函数介绍
Apr 14 Python
总结用Pdb库调试Python的方式及常用的命令
Aug 18 Python
python网络爬虫学习笔记(1)
Apr 09 Python
对numpy中轴与维度的理解
Apr 18 Python
基于Python列表解析(列表推导式)
Jun 23 Python
浅析Python 3 字符串中的 STR 和 Bytes 有什么区别
Oct 14 Python
对pyqt5中QTabWidget的相关操作详解
Jun 21 Python
python调用并链接MATLAB脚本详解
Jul 05 Python
Python安装tar.gz格式文件方法详解
Jan 19 Python
Python getattr()函数使用方法代码实例
Aug 10 Python
详解python程序中的多任务
Sep 16 Python
Python虚拟环境virtualenv是如何使用的
Jun 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
用php过滤危险html代码的函数
2008/07/22 PHP
PHP 处理图片的类实现代码
2009/10/23 PHP
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
php file_get_contents抓取Gzip网页乱码的三种解决方法
2013/11/12 PHP
javascript 写类方式之二
2009/07/05 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
javaScript如何生成xmlhttp
2013/12/16 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
Javascript中的call()方法介绍
2015/03/15 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
JS延时器提示框的应用实例代码解析
2016/04/27 Javascript
JS从一组数据中找到指定的单条数据的方法
2016/06/02 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
javascript实现点击星星小游戏
2019/12/24 Javascript
js实现移动端图片滑块验证功能
2020/09/29 Javascript
JavaScript前后端JSON使用方法教程
2020/11/23 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
[01:14:41]DOTA2-DPC中国联赛定级赛 iG vs Magma BO3第一场 1月8日
2021/03/11 DOTA
python中的实例方法、静态方法、类方法、类变量和实例变量浅析
2014/04/26 Python
Python网络爬虫出现乱码问题的解决方法
2017/01/05 Python
python+pandas分析nginx日志的实例
2018/04/28 Python
python如何生成网页验证码
2018/07/28 Python
浅谈Pandas Series 和 Numpy array中的相同点
2019/06/28 Python
详解css3自定义滚动条样式写法
2017/12/25 HTML / CSS
html5文本内容_动力节点Java学院整理
2017/07/11 HTML / CSS
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
政协会议宣传标语
2014/10/09 职场文书
2014年司法局工作总结
2014/12/11 职场文书
消防安全培训工作总结
2015/10/23 职场文书
Python初学者必备的文件读写指南
2021/06/23 Python
FFmpeg视频处理入门教程(新手必看)
2022/01/22 杂记