在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实现在matplotlib中两个坐标轴之间画一条直线光标的方法
May 20 Python
Python中的列表生成式与生成器学习教程
Mar 13 Python
python中defaultdict的用法详解
Jun 07 Python
Python开发微信公众平台的方法详解【基于weixin-knife】
Jul 08 Python
python读取与写入csv格式文件的示例代码
Dec 16 Python
详解python实现线程安全的单例模式
Mar 05 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
python基于FTP实现文件传输相关功能代码实例
Sep 28 Python
python 生成任意形状的凸包图代码
Apr 16 Python
利用Python实现学生信息管理系统的完整实例
Dec 30 Python
python中的被动信息搜集
Apr 29 Python
Python中文分词库jieba(结巴分词)详细使用介绍
Apr 07 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中常用的魔术方法
2017/04/28 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
JavaScript入门教程 Cookies
2009/01/31 Javascript
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
JS实现鼠标箭头变成一个燃烧烛光效果的方法
2015/02/28 Javascript
一款简单的jQuery图片标注效果附源码下载
2016/03/22 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
jQuery滚动新闻实现代码
2016/06/26 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
浅谈JavaScript的计时器对象
2016/12/26 Javascript
详解Vue 实例中的生命周期钩子
2017/03/21 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
[08:56]DOTA2-DPC中国联赛2月23日Recap集锦
2021/03/11 DOTA
让python json encode datetime类型
2010/12/28 Python
使用Python保存网页上的图片或者保存页面为截图
2016/03/05 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
2019/01/23 Python
Python3.4学习笔记之 idle 清屏扩展插件用法分析
2019/03/01 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
python sorted方法和列表使用解析
2019/11/18 Python
使用python自动追踪你的快递(物流推送邮箱)
2020/03/17 Python
CSS3哪些新特性值得称赞
2016/03/02 HTML / CSS
浅谈cookie和localStorage那些事
2019/08/27 HTML / CSS
Html5适配iphoneX刘海屏的简单实现
2019/04/09 HTML / CSS
生物化工专业个人自荐信
2013/09/26 职场文书
商务英语毕业生自荐信范文
2013/11/08 职场文书
班组长岗位职责范本
2014/01/05 职场文书
农村党支部先进事迹
2014/01/14 职场文书
和解协议书
2014/04/16 职场文书
幼儿教师师德承诺书
2014/05/23 职场文书
公民代理授权委托书
2014/09/24 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
高中历史教学反思
2016/02/19 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
聊聊redis-dump工具安装问题
2022/01/18 Redis
Java9新特性对HTTP2协议支持与非阻塞HTTP API
2022/03/16 Java/Android