详解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 24 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
Feb 05 Python
利用Python写一个爬妹子的爬虫
Jun 08 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
python实现批量注册网站用户的示例
Feb 22 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
Python3.8中使用f-strings调试
May 22 Python
python中shell执行知识点
May 06 Python
Python 如何创建一个线程池
Jul 28 Python
Scrapy中如何向Spider传入参数的方法实现
Sep 28 Python
Python使用grequests并发发送请求的示例
Nov 05 Python
Pycharm连接远程服务器并远程调试的全过程
Jun 24 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汉字转换拼音的类
2013/06/18 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
PHP使用Alexa API获取网站的Alexa排名例子
2014/06/12 PHP
php利用嵌套数组拼接与解析json的方法
2017/02/07 PHP
PHP使用mongoclient简单操作mongodb数据库示例
2019/02/08 PHP
php多进程中的阻塞与非阻塞操作实例分析
2020/03/04 PHP
PHP使用PDO 连接与连接管理操作实例分析
2020/04/21 PHP
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
js获取指定的cookie的具体实现
2014/02/20 Javascript
深入探讨JavaScript、JQuery屏蔽网页鼠标右键菜单及禁止选择复制
2014/06/10 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
js小数运算出现多位小数如何解决
2015/10/08 Javascript
js实现文字选中分享功能
2017/01/25 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
jQuery实现Select下拉列表进行状态选择功能
2017/03/30 jQuery
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
在vue项目中封装echarts的步骤
2020/12/25 Vue.js
[00:49]完美世界DOTA2联赛10月28日开团时刻:随便打
2020/10/29 DOTA
推荐下python/ironpython:从入门到精通
2007/10/02 Python
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
Python基于checksum计算文件是否相同的方法
2015/07/09 Python
selenium+python实现自动登录脚本
2018/04/22 Python
Python线程threading模块用法详解
2020/02/26 Python
Python RabbitMQ实现简单的进程间通信示例
2020/07/02 Python
浅谈对python中if、elif、else的误解
2020/08/20 Python
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
Bibloo罗马尼亚网站:女装、男装、童装及鞋子和配饰
2019/07/20 全球购物
代办社保委托书范文
2014/10/06 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
新生儿未入户证明
2015/06/23 职场文书
网吧温馨提示
2015/07/17 职场文书
2017年大学生寒假社会实践活动总结
2016/04/06 职场文书
ubuntu下常用apt命令介绍
2022/06/05 Servers
Android学习之BottomSheetDialog组件的使用
2022/06/21 Java/Android