详解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操作文件
Jul 31 Python
Python 机器学习库 NumPy入门教程
Apr 19 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
对python列表里的字典元素去重方法详解
Jan 21 Python
Django和Flask框架优缺点对比
Oct 24 Python
Python二元赋值实用技巧解析
Oct 25 Python
使用python的pyplot绘制函数实例
Feb 13 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
Keras:Unet网络实现多类语义分割方式
Jun 11 Python
简单了解python关键字global nonlocal区别
Sep 21 Python
分享Python异步爬取知乎热榜
Apr 12 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数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
许愿墙中用到的函数
2006/10/07 Javascript
js活用事件触发对象动作
2008/08/10 Javascript
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
js字符串的各种格式的转换 ToString,Format
2011/08/08 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
JQuery操作tr和td内容的方法实例
2013/03/06 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
JavaScript返回0-1之间随机数的方法
2015/04/06 Javascript
js获取数组的最后一个元素
2015/04/14 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
Vue中保存用户登录状态实例代码
2017/06/07 Javascript
vue.js实现刷新当前页面的方法教程
2017/07/05 Javascript
jQuery中内容过滤器简单用法示例
2018/03/31 jQuery
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
vue实现微信二次分享以及自定义分享的示例
2019/03/20 Javascript
mpvue小程序循环动画开启暂停的实现方法
2019/05/15 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
JS sort排序详细使用方法示例解析
2020/09/27 Javascript
[07:27]DOTA2卡尔工作室 英雄介绍水晶室女篇
2013/06/21 DOTA
Python编程中的for循环语句学习教程
2015/10/14 Python
python 执行文件时额外参数获取的实例
2018/12/18 Python
python使用suds调用webservice接口的方法
2019/01/03 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
Python OpenCV实现视频分帧
2019/06/01 Python
Python3的unicode编码转换成中文的问题及解决方案
2019/12/10 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
Html5页面获取微信公众号的openid的方法
2020/05/12 HTML / CSS
2014年学校国庆主题活动方案
2014/09/16 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫
i5-10400f处理相当于i7多少水平
2022/04/19 数码科技