详解Python中使用base64模块来处理base64编码的方法


Posted in Python onJuly 01, 2016

base64模块是用来作base64编码解码的。这种编码方式在电子邮件中是很常见的。
它可以把不能作为文本显示的二进制数据编码为可显示的文本信息。编码后的文本大小会增大1/3。

闲话不说了,base64模块真正用的上的方法只有8个,分别是encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode。他们8个可以两两分为4组,encode,decode一组,专门用来编码和 解码文件的,也可以对StringIO里的数据做编解码;encodestring,decodestring一组,专门用来编码和解码字符串; b64encode和b64decode一组,用来编码和解码字符串,并且有一个替换符号字符的功能。这个功能是这样的:因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为4的整数,而+和/在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什 么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候。urlsafe_b64encode和urlsafe_b64decode 一组,这个就是用来专门对url进行base64编解码的,实际上也是调用的前一组函数。

基本用法
首先准备一个64个字符的数组[‘A','B','C', … , ‘1', ‘2', … , ‘+']
然后对二进制数据进行处理, 每三个字节(byte)一组, 一共是3x8=24, 划为4组,每组6bit.这样我们得到4个数字作为索引, 然后查表获得相应的4个字符, 就是编码后的字符串.
如果编码的二进制数不是3的倍数怎么办,base64在\x00在末尾不足后,在代码的末尾添加1~2个=号,解码是自动去掉

import base64

me = base64.b64encode("mink")
print me            # print 'bWluaw=='

会把少的字符用=号补上

print base64.b64decode(me)   # print 'mink'

可以解码得到原有的字符串

urlsafe_b64encode 和 urlsafe_b64decode

base64的还提供用于url的编码方法urlsafe_b64encode 和urlsafe_b64decode.

me = base64.urlsafe_b64encode('i\xb7\x1d\xfb\xef\xff')
print me            # print 'abcd--__'

print base64.urlsafe_b64decode(me) print 'abcd++//'

因为base64编码后+和-可能会出现在字符中,所以通过urlsafe的方法把+转换为-,/转化为_.

由于=字符也可能出现在Base64编码中,但=用在URL Cookie里面会造成歧义,很多Base64编码后会把=去掉.去掉=后怎么解码呢?因为Base64是把3个字节变为4个字节,所以Base64编码的长度永远是4的倍数.因此需要加上=把Base64字符串的长度变为4的倍数,就可以正常解码了.

综合示例

#-*- encoding:gb2312 -*-
import base64
import StringIO

a = "this is a test"
b = base64.encodestring(a) # 对字符串编码
print b
print base64.decodestring(b) # 对字符串解码

c = StringIO.StringIO()
c.write(a)
d = StringIO.StringIO()
e = StringIO.StringIO()
c.seek(0)
base64.encode(c, d) # 对StringIO内的数据进行编码
print d.getvalue()
d.seek(0)
base64.decode(d, e) # 对StringIO内的数据进行解码
print e.getvalue()

a = "this is a +test"
b = base64.urlsafe_b64encode(a) # 进行url的字符串编码
print b
print base64.urlsafe_b64decode(b)

上面的encode函数和decode函数的参数其实还可以是文件对象的,那的象这样:

f1 = open('aaa.txt', 'r')
f2 = open('bbb.txt', 'w')

base64.encode(f1, f2)

f1.close()
f2.close()
Python 相关文章推荐
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
Win10下python3.5和python2.7环境变量配置教程
Sep 18 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
Jan 23 Python
python并发编程多进程之守护进程原理解析
Aug 20 Python
python3 常见解密加密算法实例分析【base64、MD5等】
Dec 19 Python
Pycharm debug调试时带参数过程解析
Feb 03 Python
TensorFlow keras卷积神经网络 添加L2正则化方式
May 22 Python
Python3 requests模块如何模仿浏览器及代理
Jun 15 Python
python+openCV对视频进行截取的实现
Nov 27 Python
Python urllib request模块发送请求实现过程解析
Dec 10 Python
Python画图学习入门教程
Jul 01 #Python
Python中json格式数据的编码与解码方法详解
Jul 01 #Python
python判断字符串编码的简单实现方法(使用chardet)
Jul 01 #Python
Python字符编码判断方法分析
Jul 01 #Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
Jul 01 #Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 #Python
python抓取并保存html页面时乱码问题的解决方法
Jul 01 #Python
You might like
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
php缩放图片(根据宽高的等比例缩放)实例介绍
2013/06/09 PHP
php模板引擎技术简单实现
2016/03/15 PHP
PHP chop()函数讲解
2019/02/11 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
基于javascript实现动态时钟效果
2020/08/18 Javascript
通过正则表达式获取url中参数的简单实现
2016/06/07 Javascript
JavaScript正则表达式实例详解
2016/10/16 Javascript
javascript实现的图片预览功能
2017/03/25 Javascript
jquery请求servlet实现ajax异步请求的示例
2017/06/03 jQuery
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
VUE饿了么树形控件添加增删改功能的示例代码
2017/10/17 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
利用Python的Django框架中的ORM建立查询API
2015/04/20 Python
Python爬虫通过替换http request header来欺骗浏览器实现登录功能
2018/01/07 Python
python线程池threadpool使用篇
2018/04/27 Python
在Pycharm中项目解释器与环境变量的设置方法
2018/10/29 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
python实现在一个画布上画多个子图
2020/01/19 Python
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
精油和天然健康美容产品:Art Naturals
2018/01/27 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
《难忘的泼水节》教学反思
2014/02/27 职场文书
自动一体化专业求职信
2014/03/15 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
教师党员整改措施
2014/10/24 职场文书
2015应届毕业生求职信范文
2015/03/20 职场文书
普通员工辞职信范文
2015/05/12 职场文书
离婚起诉状范本
2015/05/19 职场文书
Python实现随机生成迷宫并自动寻路
2021/06/13 Python