在Python中使用base64模块处理字符编码的教程


Posted in Python onApril 28, 2015

Base64是一种用64个字符来表示任意二进制数据的方法。

用记事本打开exe、jpg、pdf这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。

Base64的原理很简单,首先,准备一个包含64个字符的数组:

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']

然后,对二进制数据进行处理,每3个字节一组,一共是3x8=24bit,划为4组,每组正好6个bit:

在Python中使用base64模块处理字符编码的教程

这样我们得到4个数字作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。

所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。

如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

Python内置的base64可以直接进行base64的编解码:

>>> import base64
>>> base64.b64encode('binary\x00string')
'YmluYXJ5AHN0cmluZw=='
>>> base64.b64decode('YmluYXJ5AHN0cmluZw==')
'binary\x00string'

由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符+和/分别变成-和_:

>>> base64.b64encode('i\xb7\x1d\xfb\xef\xff')
'abcd++//'
>>> base64.urlsafe_b64encode('i\xb7\x1d\xfb\xef\xff')
'abcd--__'
>>> base64.urlsafe_b64decode('abcd--__')
'i\xb7\x1d\xfb\xef\xff'

还可以自己定义64个字符的排列顺序,这样就可以自定义Base64编码,不过,通常情况下完全没有必要。

Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。

Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。

由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉:

# 标准Base64:
'abcd' -> 'YWJjZA=='
# 自动去掉=:
'abcd' -> 'YWJjZA'

去掉=后怎么解码呢?因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上=把Base64字符串的长度变为4的倍数,就可以正常解码了。

请写一个能处理去掉=的base64解码函数:

>>> base64.b64decode('YWJjZA==')
'abcd'
>>> base64.b64decode('YWJjZA')
Traceback (most recent call last):
 ...
TypeError: Incorrect padding
>>> safe_b64decode('YWJjZA')
'abcd'

小结

Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。

Python 相关文章推荐
python查找目录下指定扩展名的文件实例
Apr 01 Python
Python中map和列表推导效率比较实例分析
Jun 17 Python
对pandas进行数据预处理的实例讲解
Apr 20 Python
Python装饰器简单用法实例小结
Dec 03 Python
python 发送和接收ActiveMQ消息的实例
Jan 30 Python
Django+uni-app实现数据通信中的请求跨域的示例代码
Oct 12 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
Matplotlib使用字符串代替变量绘制散点图的方法
Feb 17 Python
利用Python计算KS的实例详解
Mar 03 Python
python数据类型强制转换实例详解
Jun 22 Python
5道关于python基础 while循环练习题
Nov 27 Python
Python实现Matplotlib,Seaborn动态数据图
May 06 Python
使用Python的内建模块collections的教程
Apr 28 #Python
进一步探究Python中的正则表达式
Apr 28 #Python
在Python程序中实现分布式进程的教程
Apr 28 #Python
浅析Python多线程下的变量问题
Apr 28 #Python
python实现向ppt文件里插入新幻灯片页面的方法
Apr 28 #Python
Python实现对PPT文件进行截图操作的方法
Apr 28 #Python
在Python下尝试多线程编程
Apr 28 #Python
You might like
用PHP+MySql编写聊天室
2006/10/09 PHP
一个捕获函数输出的函数
2007/02/14 PHP
php判断终端是手机还是电脑访问网站的思路及代码
2013/04/24 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
PHP实现的AES双向加密解密功能示例【128位】
2018/09/03 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
Javascript 两个窗体之间传值实现代码
2009/09/25 Javascript
一些javascript一些题目的解析
2010/12/25 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
网站接入QQ登录的两种方法
2014/07/22 Javascript
jQuery实现在最后一个元素之前插入新元素的方法
2015/07/18 Javascript
JavaScript计算器网页版实现代码分享
2016/07/15 Javascript
textarea 在浏览器中固定大小和禁止拖动的实现方法
2016/12/03 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
layui默认选中table的CheckBox复选框方法
2019/09/19 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
Python实现SMTP发送邮件详细教程
2021/03/02 Python
如何利用Fabric自动化你的任务
2016/10/20 Python
Python实现Pig Latin小游戏实例代码
2018/02/02 Python
python之从文件读取数据到list的实例讲解
2018/04/19 Python
Python常用字符串替换函数strip、replace及sub用法示例
2018/05/21 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
Python使用matplotlib实现交换式图形显示功能示例
2019/09/06 Python
详解pandas赋值失败问题解决
2020/11/29 Python
python实现发送QQ邮件(可加附件)
2020/12/23 Python
HTML5所有标签汇总及标签意义解释
2015/03/12 HTML / CSS
canvas裁剪clip()函数的具体使用
2018/03/01 HTML / CSS
美国隐形眼镜销售网站:ContactsDirect
2017/10/28 全球购物
联想澳大利亚官网:Lenovo Australia
2018/01/18 全球购物
美国婴儿用品及配件购买网站:Munchkin
2019/04/03 全球购物
公安学专业求职信
2014/07/27 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
学生检讨书怎么写
2014/10/09 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书