详解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通过线程实现定时器timer的方法
Mar 16 Python
Python设计模式之中介模式简单示例
Jan 09 Python
用python处理MS Word的实例讲解
May 08 Python
如何在django里上传csv文件并进行入库处理的方法
Jan 02 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
Python实现带下标索引的遍历操作示例
May 30 Python
django-filter和普通查询的例子
Aug 12 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
python 字段拆分详解
Dec 17 Python
用OpenCV进行年龄和性别检测的实现示例
Jan 29 Python
Python如何利用正则表达式爬取网页信息及图片
Apr 17 Python
python编写五子棋游戏
May 25 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 生成唯一id的几种解决方法
2013/03/08 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
php获取发送给用户的header信息的方法
2015/03/16 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
关于PHP中协程和阻塞的一些理解与思考
2017/08/11 PHP
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
基于jquery的一个OutlookBar类,动态创建导航条
2010/11/19 Javascript
jQuery表格行换色的三种实现方法
2011/06/27 Javascript
JavaScript判断DOM何时加载完毕的技巧
2012/11/11 Javascript
jquery制作居中遮罩层效果分享
2014/02/21 Javascript
搭建pomelo 开发环境
2014/06/24 Javascript
基于JavaScript代码实现兼容各浏览器的设为首页和加入收藏
2016/01/07 Javascript
jQuery中通过ajax的get()函数读取页面的方法
2016/02/29 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
javascript实现将数字转成千分位的方法小结【5种方式】
2016/12/11 Javascript
详解angularJS自定义指令间的相互交互
2017/07/05 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
使用axios请求时,发送formData请求的示例
2019/10/29 Javascript
js常用方法、检查是否有特殊字符串、倒序截取字符串操作完整示例
2020/01/26 Javascript
python实现向ppt文件里插入新幻灯片页面的方法
2015/04/28 Python
Python实现telnet服务器的方法
2015/07/10 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
Python文件夹批处理操作代码实例
2020/07/21 Python
CSS3之边框多颜色Border-color属性使用示例
2013/10/11 HTML / CSS
基于Html5实现的react拖拽排序组件示例
2018/08/13 HTML / CSS
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
业务员岗位职责
2013/11/16 职场文书
班长演讲稿范文
2014/04/24 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
使用pandas模块实现数据的标准化操作
2021/05/14 Python
python ConfigParser库的使用及遇到的坑
2022/02/12 Python