详解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中精确输出JSON浮点数的方法
Apr 18 Python
Python冒泡排序注意要点实例详解
Sep 09 Python
python处理两种分隔符的数据集方法
Dec 12 Python
基于OpenCV python3实现证件照换背景的方法
Mar 22 Python
Python面向对象之继承和多态用法分析
Jun 08 Python
pandas的qcut()方法详解
Jul 06 Python
python从zip中删除指定后缀文件(推荐)
Dec 05 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
Jun 23 Python
python实现数据结构中双向循环链表操作的示例
Oct 09 Python
Python趣味挑战之教你用pygame画进度条
May 31 Python
解决Pytorch修改预训练模型时遇到key不匹配的情况
Jun 05 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 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
IIS环境下快速安装、配置和调试PHP5.2.0
2006/12/17 PHP
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
PHP中将网页导出为Word文档的代码
2012/05/25 PHP
如何使用PHP计算上一个月的今天
2013/05/23 PHP
ThinkPHP中ajax使用实例教程
2014/08/22 PHP
php实现的替换敏感字符串类实例
2014/09/22 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
Symfony控制层深入详解
2016/03/17 PHP
php支持断点续传、分块下载的类
2016/05/02 PHP
PHP 裁剪图片
2021/03/09 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
js 动态选中下拉框
2009/11/26 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
简单方法判断JavaScript对象为null或者属性为空
2014/09/26 Javascript
js网页右下角提示框实例
2014/10/14 Javascript
几种二级联动案例(jQuery\Array\Ajax php)
2016/08/13 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
jquery设置css样式的多种方法(总结)
2017/02/21 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
支付宝小程序tabbar底部导航
2018/11/06 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
JavaScript JMap类定义与使用方法示例
2019/01/22 Javascript
Node.js 获取微信JS-SDK CONFIG的方法示例
2019/05/21 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
python实现寻找最长回文子序列的方法
2018/06/02 Python
idea创建springMVC框架和配置小文件的教程图解
2018/09/18 Python
Hotels.com越南:酒店预订
2019/10/29 全球购物
自我评价的写作规则
2014/01/06 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
社区公民道德宣传日活动总结
2015/03/23 职场文书
首都博物馆观后感
2015/06/05 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
Python字典的基础操作
2021/11/01 Python