详解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文件与文件夹常见基本操作总结
Sep 19 Python
matplotlib调整子图间距,调整整体空白的方法
Aug 03 Python
python RabbitMQ 使用详细介绍(小结)
Nov 08 Python
Python实现查找字符串数组最长公共前缀示例
Mar 27 Python
Python自定义一个异常类的方法
Jun 27 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
Python定义函数时参数有默认值问题解决
Dec 19 Python
python GUI库图形界面开发之PyQt5访问系统剪切板QClipboard类详细使用方法与实例
Feb 27 Python
python:批量统计xml中各类目标的数量案例
Mar 10 Python
Python使用pyyaml模块处理yaml数据
Apr 14 Python
python如何调用字典的key
May 25 Python
python时间序列数据转为timestamp格式的方法
Aug 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
浅析使用Turck-mmcache编译来加速、优化PHP代码
2013/06/20 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
PHP类中的魔术方法(Magic Method)简明总结
2014/07/08 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
PHP xpath提取网页数据内容代码解析
2020/07/16 PHP
javascript中对对层的控制
2006/12/29 Javascript
编写自己的jQuery插件简单实现代码
2011/04/19 Javascript
document.documentElement和document.body区别介绍
2013/09/16 Javascript
Node.js实现的简易网页抓取功能示例
2014/12/05 Javascript
node.js实现BigPipe详解
2014/12/05 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
js实现文本框中输入文字页面中div层同步获取文本框内容的方法
2015/03/03 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
js正则表达式验证表单【完整版】
2017/03/06 Javascript
详解EasyUi控件中的Datagrid
2017/08/23 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
redux中间件之redux-thunk的具体使用
2018/04/17 Javascript
vue.js中实现登录控制的方法示例
2018/04/23 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
jQuery实现每日秒杀商品倒计时功能
2019/09/06 jQuery
Python实现简单查找最长子串功能示例
2019/02/26 Python
python3调用windows dos命令的例子
2019/08/14 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
基于pycharm 项目和项目文件命名规则的介绍
2021/01/15 Python
sort命令的作用和用法
2012/11/04 面试题
介绍一下UNIX启动过程
2013/11/14 面试题
团结就是力量演讲稿
2014/05/21 职场文书
学校扫黄打非工作总结
2015/10/15 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
mysql优化
2021/04/06 MySQL
浅谈vue2的$refs在vue3组合式API中的替代方法
2021/04/18 Vue.js
python3实现Dijkstra算法最短路径的实现
2021/05/12 Python