详解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 检查数组元素是否存在类似PHP isset()方法
Oct 14 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 Python
TensorFlow模型保存/载入的两种方法
Mar 08 Python
tensorflow 获取模型所有参数总和数量的方法
Jun 14 Python
Python读取指定日期邮件的实例
Feb 01 Python
一步步教你用python的scrapy编写一个爬虫
Apr 17 Python
python+numpy实现的基本矩阵操作示例
Jul 19 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
用python拟合等角螺线的实现示例
Dec 27 Python
Python中有几个关键字
Jun 04 Python
了解一下python内建模块collections
Sep 07 Python
Python读取文件夹下的所有文件实例代码
Apr 02 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
咖啡知识 除了喝咖啡还有那些知识点
2021/03/06 新手入门
介绍一些PHP判断变量的函数
2012/04/24 PHP
php代码中使用换行及(\n或\r\n和br)的应用
2013/02/02 PHP
PHP数组操作简单案例分析
2016/10/15 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
js不是基础的基础
2006/12/24 Javascript
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
vue-resourse将json数据输出实例
2017/03/08 Javascript
详解基于vue-cli配置移动端自适应
2018/01/13 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
python模拟鼠标拖动操作的方法
2015/03/11 Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
图文详解WinPE下安装Python
2016/05/17 Python
python数据结构之列表和元组的详解
2017/09/23 Python
python中kmeans聚类实现代码
2018/02/23 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
python如何读写csv数据
2018/03/21 Python
Python编写一个优美的下载器
2018/04/15 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
Python双链表原理与实现方法详解
2020/02/22 Python
关于jupyter打开之后不能直接跳转到浏览器的解决方式
2020/04/13 Python
属性与 @property 方法让你的python更高效
2020/09/21 Python
行政文员实习自我鉴定范文
2014/09/14 职场文书
四风批评与自我批评发言稿
2014/10/14 职场文书
全国助残日活动总结
2015/05/11 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
基于Redis过期事件实现订单超时取消
2021/05/08 Redis
pytorch实现手写数字图片识别
2021/05/20 Python