详解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 参数列表中的self 显式不等于冗余
Dec 01 Python
Python常用内置函数总结
Feb 08 Python
Python守护进程用法实例分析
Jun 04 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
ansible作为python模块库使用的方法实例
Jan 17 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
python制作mysql数据迁移脚本
Jan 01 Python
python实现车牌识别的示例代码
Aug 05 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
python文件编写好后如何实践
Jul 07 Python
如何基于pandas读取csv后合并两个股票
Sep 25 Python
Python importlib模块重载使用方法详解
Oct 13 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 面向对象 final类与final方法
2010/05/05 PHP
php自定义apk安装包实例
2014/10/20 PHP
thinkphp中空模板与空模块的用法实例
2014/11/26 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
php5.x禁用eval的操作方法
2018/10/19 PHP
javascript 面向对象,实现namespace,class,继承,重载
2009/10/29 Javascript
js星星评分效果
2014/07/24 Javascript
Node.js中child_process实现多进程
2015/02/03 Javascript
AngularJs  Understanding Angular Templates
2016/09/02 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
jquery插件开发之选项卡制作详解
2017/08/30 jQuery
javaScript实现鼠标在文字上悬浮时弹出悬浮层效果
2020/04/12 Javascript
Vue中的验证登录状态的实现方法
2019/03/09 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
vue 实现模糊检索并根据其他字符的首字母顺序排列
2019/09/19 Javascript
Python通过select实现异步IO的方法
2015/06/04 Python
python高阶爬虫实战分析
2018/07/29 Python
pygame实现简易飞机大战
2018/09/11 Python
Python常用模块之requests模块用法分析
2019/05/15 Python
python pygame实现五子棋小游戏
2020/10/26 Python
Python脚本导出为exe程序的方法
2020/03/25 Python
浅谈CSS3 box-sizing 属性 有趣的盒模型
2019/04/02 HTML / CSS
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
雅诗兰黛香港官网:Estee Lauder香港
2017/09/26 全球购物
前台接待岗位职责
2013/12/03 职场文书
《巨人的花园》教学反思
2014/02/12 职场文书
有趣的广告词
2014/03/18 职场文书
司机工作自我鉴定
2014/09/19 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
教育读书笔记
2015/07/02 职场文书
2016大一新生军训感言
2015/12/08 职场文书
简单总结SpringMVC拦截器的使用方法
2021/06/28 Java/Android
Python机器学习之决策树和随机森林
2021/07/15 Javascript
一文搞懂Java中的注解和反射
2022/06/21 Java/Android