详解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函数的对象、函数嵌套、名称空间和作用域
May 31 Python
python常用函数与用法示例
Jul 02 Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 Python
Python中的 ansible 动态Inventory 脚本
Jan 19 Python
tensorflow 模型权重导出实例
Jan 24 Python
Python实现获取当前目录下文件名代码详解
Mar 10 Python
Python telnet登陆功能实现代码
Apr 16 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
Scrapy 配置动态代理IP的实现
Sep 28 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
详解Python 中的 defaultdict 数据类型
Feb 22 Python
Python+Appium新手教程
Apr 17 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下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
PHP获取中英混合字符串长度的方法
2014/06/07 PHP
WordPress中自定义后台管理界面配色方案的小技巧
2015/12/29 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
PHP页面间传递值和保持值的方法
2016/08/24 PHP
PHP查询大量数据内存耗尽问题的解决方法
2016/10/28 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
JavaScript高级程序设计
2006/12/29 Javascript
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
比较搞笑的js陷阱题
2010/02/07 Javascript
javascript实现跳转菜单的具体方法
2013/07/05 Javascript
一些老手都不一定知道的JavaScript技巧
2014/05/06 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
JS获取Table中td值的方法
2015/03/19 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
Angular.js自定义指令学习笔记实例
2017/02/24 Javascript
React组件refs的使用详解
2018/02/09 Javascript
js正则表达式校验指定字符串的方法
2018/07/23 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
Python实现的归并排序算法示例
2017/11/21 Python
python实现决策树分类(2)
2018/08/30 Python
Python3内置模块之json编解码方法小结【推荐】
2020/12/09 Python
python 微信好友特征数据分析及可视化
2020/01/07 Python
使用OpenCV实现人脸图像卡通化的示例代码
2021/01/15 Python
CSS3 选择器 属性选择器介绍
2012/01/21 HTML / CSS
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
C++面试题:关于链表和指针
2013/06/05 面试题
招商经理岗位职责
2013/11/16 职场文书
企业环保标语
2014/06/10 职场文书
科技节口号
2014/06/19 职场文书
MySQL 数据类型详情
2021/11/11 MySQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
2022/01/18 PostgreSQL
Javascript的promise,async和await的区别详解
2022/03/24 Javascript
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android