详解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 爬虫图片简单实现
Jun 01 Python
django 发送手机验证码的示例代码
Apr 25 Python
好的Python培训机构应该具备哪些条件
May 23 Python
Python中关键字global和nonlocal的区别详解
Sep 03 Python
Python 实现Serial 与STM32J进行串口通讯
Dec 18 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
Feb 12 Python
Python networkx包的实现
Feb 14 Python
selenium切换标签页解决get超时问题的完整代码
Aug 30 Python
Django数据库迁移常见使用方法
Nov 12 Python
python Tkinter的简单入门教程
Apr 11 Python
梳理总结Python开发中需要摒弃的18个坏习惯
Jan 22 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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基础知识:函数基础知识
2006/12/13 PHP
基于php 随机数的深入理解
2013/06/05 PHP
php批量添加数据与批量更新数据的实现方法
2014/12/16 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP共享内存用法实例分析
2016/02/12 PHP
php使用Jpgraph创建3D饼形图效果示例
2017/02/15 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
php使用event扩展的io复用测试的示例
2020/10/20 PHP
学习jquery之一
2007/04/27 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
js中获取时间new Date()的全面介绍
2016/06/20 Javascript
基于react框架使用的一些细节要点的思考
2017/05/31 Javascript
Vue-router 类似Vuex实现组件化开发的示例
2017/09/15 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
JS实现为动态添加的元素增加事件功能示例【基于事件委托】
2018/03/21 Javascript
微信小程序表单验证form提交错误提示效果
2020/06/19 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
vue的style绑定background-image的方式和其他变量数据的区别详解
2018/09/03 Javascript
微信小程序出现wx.getLocation再次授权问题的解决方法分析
2019/01/16 Javascript
[44:40]Serenity vs Pain 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
Python进阶-函数默认参数(详解)
2017/05/18 Python
Python进阶之全面解读高级特性之切片
2019/02/19 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
基于python分析你的上网行为 看看你平时上网都在干嘛
2019/08/13 Python
Pytorch Tensor的统计属性实例讲解
2019/12/30 Python
Python 线性回归分析以及评价指标详解
2020/04/02 Python
matlab中二维插值函数interp2的使用详解
2020/04/22 Python
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
2014年最新学习全国两会精神心得
2014/03/17 职场文书
2015年员工工作总结范文
2015/04/08 职场文书
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏
手把手带你彻底卸载MySQL数据库
2022/06/14 MySQL
PostgreSQL之连接失败的问题及解决
2023/05/08 PostgreSQL