详解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中利用sqrt()方法进行平方根计算的教程
May 15 Python
Python实现的简单dns查询功能示例
May 24 Python
Python闭包之返回函数的函数用法示例
Jan 27 Python
WxPython建立批量录入框窗口
Feb 27 Python
django的聚合函数和aggregate、annotate方法使用详解
Jul 23 Python
Django1.11配合uni-app发起微信支付的实现
Oct 12 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 Python
python求质数列表的例子
Nov 24 Python
python 基于Apscheduler实现定时任务
Dec 15 Python
python 三边测量定位的实现代码
Apr 22 Python
python not运算符的实例用法
Jun 30 Python
Python OpenCV之常用滤波器使用详解
Apr 07 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中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
让Laravel API永远返回JSON格式响应的方法示例
2018/09/05 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
PHP 99乘法表的几种实现代码
2020/10/13 PHP
artDialog双击会关闭对话框的修改过程分享
2013/08/05 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
js给table赋值的实例代码
2016/10/13 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
微信小程序数据存储与取值详解
2018/01/30 Javascript
Angularjs实现页面模板清除的方法
2018/07/20 Javascript
解决Vue2.0中使用less给元素添加背景图片出现的问题
2018/09/03 Javascript
vue从一个页面跳转到另一个页面并携带参数的解决方法
2019/08/12 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
[03:00]2014DOTA2国际邀请赛 Titan淘汰潸然泪下Ohaiyo专访
2014/07/15 DOTA
使用Python神器对付12306变态验证码
2016/01/05 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
python常用数据重复项处理方法
2019/11/22 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
解决python运行启动报错问题
2020/06/01 Python
改变 Python 中线程执行顺序的方法
2020/09/24 Python
浅谈CSS3鼠标移入图片动态提示效果(transform)
2017/11/06 HTML / CSS
Tretorn美国官网:瑞典外套和鞋类品牌,抵御风雨
2018/07/19 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
会计专业应届生自荐信
2014/02/07 职场文书
党性观念心得体会
2014/09/03 职场文书
解除劳动合同证明书
2014/09/26 职场文书
职位证明模板
2015/06/23 职场文书
公司转让协议书
2016/03/19 职场文书
交通安全宣传标语(100条)
2019/08/22 职场文书
python如何获取网络数据
2021/04/11 Python
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js