详解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中numpy基础学习及进行数组和矢量计算
Feb 12 Python
Python获取当前页面内所有链接的四种方法对比分析
Aug 19 Python
关于反爬虫的一些简单总结
Dec 13 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
解决python线程卡死的问题
Feb 18 Python
在Python中等距取出一个数组其中n个数的实现方式
Nov 27 Python
解决python父线程关闭后子线程不关闭问题
Apr 25 Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
Oct 15 Python
python实现马丁策略的实例详解
Jan 15 Python
如何使用PyCharm及常用配置详解
Jun 03 Python
Python实现为PDF去除水印的示例代码
Apr 03 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
Yii2隐藏frontend/web和backend/web的方法
2015/12/12 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
让浏览器非阻塞加载javascript的几种方法小结
2011/04/25 Javascript
jquery 笔记 事件
2011/11/02 Javascript
整理8个很棒的 jQuery 倒计时插件和教程
2011/12/12 Javascript
js限制textarea每行输入字符串长度的代码
2012/10/31 Javascript
Js判断CSS文件加载完毕的具体实现
2014/01/17 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
JavaScript高阶函数_动力节点Java学院整理
2017/06/28 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
js作用域和作用域链及预解析
2019/04/11 Javascript
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
Python使用random和tertools模块解一些经典概率问题
2015/01/28 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
Python实例一个类背后发生了什么
2016/02/09 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
2018/12/15 Python
浅谈Python批处理文件夹中的txt文件
2019/03/11 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
python 遍历pd.Series的index和value
2019/11/26 Python
pytorch加载自定义网络权重的实现
2020/01/07 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
波兰珠宝品牌:YES
2019/08/09 全球购物
外企C语言笔试题
2013/11/10 面试题
小学校园之星事迹材料
2014/05/16 职场文书
大学生党员个人对照检查材料范文
2014/09/25 职场文书
2014年图书馆个人工作总结
2014/12/18 职场文书
2016年大学自主招生自荐信范文
2015/03/24 职场文书
idea搭建可运行Servlet的Web项目
2021/06/26 Java/Android
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL