详解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格式化压缩后的JS文件的方法
Mar 05 Python
利用python发送和接收邮件
Sep 27 Python
儿童python练习实例
May 27 Python
pandas进行时间数据的转换和计算时间差并提取年月日
Jul 06 Python
python tkinter窗口最大化的实现
Jul 15 Python
使用OpenCV实现仿射变换—平移功能
Aug 29 Python
Python容器使用的5个技巧和2个误区总结
Sep 26 Python
基于Python执行dos命令并获取输出的结果
Dec 30 Python
Python+Opencv实现把图片、视频互转的示例
Dec 17 Python
pycharm配置安装autopep8自动规范代码的实现
Mar 02 Python
Python实现归一化算法详情
Mar 18 Python
python​格式化字符串
Apr 20 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中几种常见安全设置详解
2010/04/06 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
golang、python、php、c++、c、java、Nodejs性能对比
2017/03/12 NodeJs
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
extjs 如何给column 加上提示
2014/07/29 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
Jquery中request和request.form和request.querystring的区别
2015/11/26 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
checkbox批量选中,获取选中项的值的简单实例
2016/06/28 Javascript
浅谈Javascript中的Label语句
2016/12/14 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
JavaScript变速动画函数封装添加任意多个属性
2019/04/03 Javascript
vue中如何实现后台管理系统的权限控制的方法步骤
2019/09/05 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
[02:06]DOTA2英雄基础教程 暗影萨满
2013/12/16 DOTA
Python Sqlite3以字典形式返回查询结果的实现方法
2016/10/03 Python
python中reduce()函数的使用方法示例
2017/09/29 Python
Python拼接微信好友头像大图的实现方法
2018/08/01 Python
Python的log日志功能及设置方法
2019/07/11 Python
Python爬虫 批量爬取下载抖音视频代码实例
2019/08/16 Python
python使用ctypes调用扩展模块的实例方法
2020/01/28 Python
解决keras backend 越跑越慢问题
2020/06/18 Python
学python爬虫能做什么
2020/07/29 Python
Notino瑞典:购买香水和美容产品
2019/07/26 全球购物
大一学生的职业生涯规划书范文
2014/01/19 职场文书
2014年最新大专生职业生涯规划书范文
2014/09/13 职场文书
县委常委班子专题民主生活会查摆问题及整改措施
2014/09/27 职场文书
2014年租房协议书范本
2014/10/30 职场文书
三八妇女节慰问信
2015/02/14 职场文书
作息时间调整通知
2015/04/22 职场文书
jQuery实现影院选座订座效果
2021/04/13 jQuery
Springboot-cli 开发脚手架,权限认证,附demo演示
2022/04/28 Java/Android