详解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 相关文章推荐
pycharm 使用心得(四)显示行号
Jun 05 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
Apr 01 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
实例详解Python模块decimal
Jun 26 Python
python字符串替换第一个字符串的方法
Jun 26 Python
python实现单链表的方法示例
Sep 03 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
python文字转语音实现过程解析
Nov 12 Python
Win10环境中如何实现python2和python3并存
Jul 20 Python
Python实现Excel自动分组合并单元格
Feb 22 Python
用Python简陋模拟n阶魔方
Apr 17 Python
使用pandas模块实现数据的标准化操作
May 14 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
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
杏林同学录(六)
2006/10/09 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
Laravel中unique和exists验证规则的优化详解
2018/01/28 PHP
用ASP将SQL搜索出来的内容导出为TXT的代码
2007/07/27 Javascript
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
jQuery子窗体取得父窗体元素的方法
2015/05/11 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
2015/10/02 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
详解AngularJS Filter(过滤器)用法
2015/12/28 Javascript
浅谈Nodejs应用主文件index.js
2016/08/28 NodeJs
详解Vue-基本标签和自定义控件
2017/03/24 Javascript
浅谈vue引入css,less遇到的坑和解决方法
2018/01/20 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
深入解析神经网络从原理到实现
2019/07/26 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
python 实现单例模式的5种方法
2020/09/23 Python
canvas实现滑动验证的实现示例
2020/08/11 HTML / CSS
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
热能动力工程毕业生自荐信
2013/11/07 职场文书
医学类导师推荐信范文
2013/11/19 职场文书
国庆阅兵观后感
2015/06/15 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
手写实现JS中的new
2021/11/07 Javascript
Python实现信息管理系统
2022/06/05 Python