详解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基础-流程控制
Mar 18 Python
python实现图片文件批量重命名
Mar 23 Python
对Python 3.2 迭代器的next函数实例讲解
Oct 18 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
对python 自定义协议的方法详解
Feb 13 Python
python经典趣味24点游戏程序设计
Jul 26 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
详解Python并发编程之从性能角度来初探并发编程
Aug 23 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
Python flask路由间传递变量实例详解
Jun 03 Python
如何解决cmd运行python提示不是内部命令
Jul 01 Python
Python如何急速下载第三方库详解
Nov 02 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/10/09 PHP
php数组函数序列之array_slice() - 在数组中根据条件取出一段值,并返回
2011/11/07 PHP
10个实用的PHP正则表达式汇总
2014/10/23 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
phpStorm2020 注册码
2020/09/17 PHP
JS array 数组详解
2009/03/22 Javascript
基于jQuery的history历史记录插件
2010/12/11 Javascript
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
Asp.Net alert弹出提示信息的几种方法总结
2014/01/29 Javascript
jquery实现模拟百分比进度条渐变效果代码
2015/10/29 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
Javascript Function.prototype.bind详细分析
2016/12/29 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
详谈JavaScript的闭包及应用
2017/01/17 Javascript
jquery图片放大镜效果
2017/06/23 jQuery
jQuery EasyUI 选项卡面板tabs的使用实例讲解
2017/12/25 jQuery
基于Vue中的父子传值问题解决
2020/07/27 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
[47:03]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第二场 12.10
2020/12/13 DOTA
Python脚本实现下载合并SAE日志
2015/02/10 Python
python万年历实现代码 含运行结果
2017/05/20 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
FC-Moto丹麦:欧洲最大的摩托车服装和头盔商店之一
2019/08/20 全球购物
大学四年规划书范文
2013/12/27 职场文书
市场营销职业生涯规划书范文
2014/01/12 职场文书
《两个铁球同时着地》教学反思
2014/02/13 职场文书
公司经理聘任书
2014/03/29 职场文书
市场营销战略计划书
2014/05/06 职场文书
小学教师个人总结
2015/02/05 职场文书
讲文明倡议书
2015/04/29 职场文书
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js
SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理
2022/06/21 Java/Android
Python中tqdm的使用和例子
2022/09/23 Python