在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 SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
May 06 Python
python+django快速实现文件上传
Oct 24 Python
Python常用库推荐
Dec 04 Python
利用python将图片转换成excel文档格式
Dec 30 Python
python中比较两个列表的实例方法
Jul 04 Python
python批量解压zip文件的方法
Aug 20 Python
python实现广度优先搜索过程解析
Oct 19 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
flask框架蓝图和子域名配置详解
Jan 25 Python
对python中list的五种查找方法说明
Jul 13 Python
python Django框架快速入门教程(后台管理)
Jul 21 Python
Python Django / Flask如何使用Elasticsearch
Apr 19 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
在PHP3中实现SESSION的功能(三)
2006/10/09 PHP
收集的DedeCMS一些使用经验
2007/03/17 PHP
PHP之图片上传类实例代码(加了缩略图)
2016/06/30 PHP
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
2011/01/15 Javascript
判断是否安装flash player及当前版本的JS代码
2013/08/08 Javascript
浅析Cookie中的Path与domain
2013/12/18 Javascript
js给页面加style无效果的解决方法
2014/01/20 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
学习javascript面向对象 掌握创建对象的9种方式
2016/01/04 Javascript
jQuery绑定事件on()与弹窗的简要概述
2016/04/27 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
JS实现中英文混合文字溢出友好截取功能
2018/08/06 Javascript
详解使用JWT实现单点登录(完全跨域方案)
2019/08/02 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
原生javascript制作的拼图游戏实现方法详解
2020/02/23 Javascript
解决vue-router路由拦截造成死循环问题
2020/08/05 Javascript
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
利用Python演示数型数据结构的教程
2015/04/03 Python
解析Mac OS下部署Pyhton的Django框架项目的过程
2016/05/03 Python
python中range()与xrange()用法分析
2016/09/21 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
django使用admin站点上传图片的实例
2019/07/28 Python
django创建超级用户过程解析
2019/09/18 Python
基于Python测试程序是否有错误
2020/05/16 Python
python super()函数的基本使用
2020/09/10 Python
Clearly澳大利亚:购买眼镜、太阳镜和隐形眼镜
2018/04/26 全球购物
ECCO英国官网:丹麦鞋履品牌
2019/09/03 全球购物
普通大学毕业生自荐信
2013/11/04 职场文书
员工年终演讲稿
2014/01/03 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
社团活动总结书
2014/06/27 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript