在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标准算法实现数组全排列的方法
Mar 17 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
Python编程中类与类的关系详解
Aug 08 Python
基于python plotly交互式图表大全
Dec 07 Python
Python和Anaconda和Pycharm安装教程图文详解
Feb 04 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
深入了解Python 方法之类方法 & 静态方法
Aug 17 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 Python
python可视化大屏库big_screen示例详解
Nov 23 Python
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
Apr 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将csv文件导入到mysql数据库的方法
2014/12/24 PHP
PHP中FTP相关函数小结
2016/07/15 PHP
javascript中获取选中对象的类型
2007/04/02 Javascript
Jsonp 跨域的原理以及Jquery的解决方案
2011/06/27 Javascript
jquery操作HTML5 的data-*的用法实例分享
2014/08/17 Javascript
JavaScript中的Function函数
2015/08/27 Javascript
轻松搞定jQuery.noConflict()
2016/02/15 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
jQuery+正则+文本框只能输入数字的实现方法
2016/10/07 Javascript
JavaScript验证知识整理
2017/03/24 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
JavaScript之underscore_动力节点Java学院整理
2017/07/03 Javascript
vue cli webpack中使用sass的方法
2018/02/24 Javascript
js input输入百分号保存数据库失败的解决方法
2018/05/26 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
Python通过解析网页实现看报程序的方法
2014/08/04 Python
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
使用Python对SQLite数据库操作
2017/04/06 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
python实现画循环圆
2019/11/23 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
LTD Commodities:礼品,独特发现,家居装饰,家用器皿
2017/08/11 全球购物
JYSK加拿大:购买家具、床垫、家居装饰等
2020/02/14 全球购物
综合素质的自我鉴定
2013/10/07 职场文书
演讲稿开场白
2014/01/13 职场文书
《猫》教学反思
2014/02/26 职场文书
土地转让协议书
2014/04/15 职场文书
理想演讲稿范文
2014/05/21 职场文书
2014年创卫工作总结
2014/11/24 职场文书
先进个人事迹材料
2014/12/29 职场文书
学校食堂管理制度
2015/08/04 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python