在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中的__SLOTS__属性使用示例
Feb 18 Python
Python3中多线程编程的队列运作示例
Apr 16 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
批处理与python代码混合编程的方法
May 19 Python
python修改list中所有元素类型的三种方法
Apr 09 Python
简单了解python反射机制的一些知识
Jul 13 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
django中间键重定向实例方法
Nov 10 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
python实现扫雷小游戏
Apr 24 Python
Python中zip函数如何使用
Jun 04 Python
keras自定义损失函数并且模型加载的写法介绍
Jun 15 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循环输出数据库内容的代码
2008/05/24 PHP
PHP session_start()问题解疑(详细介绍)
2013/07/05 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
HR vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
字符串的replace方法应用浅析
2011/12/06 Javascript
给事件响应函数传参数的四种方式小结
2013/12/05 Javascript
jQuery中removeAttr()方法用法实例
2015/01/05 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
NodeJs——入门必看攻略
2016/06/27 NodeJs
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
在js代码拼接dom对象到页面上去的模板总结(必看)
2017/02/14 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
vue基于Element构建自定义树的示例代码
2017/09/19 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
详解如何在vue-cli中使用vuex
2018/08/07 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
Django中的文件的上传的几种方式
2018/07/23 Python
python字符串,元组,列表,字典互转代码实例详解
2020/02/14 Python
在python中利用dict转json按输入顺序输出内容方式
2020/02/27 Python
Pycharm连接远程服务器过程图解
2020/04/30 Python
Ref与out有什么不同
2012/11/24 面试题
智乐游戏测试笔试题
2014/05/21 面试题
Ruby如何实现动态方法调用
2012/11/18 面试题
我的教育故事演讲稿
2014/05/04 职场文书
公司回复函格式
2015/07/14 职场文书
运动会新闻报道稿
2015/07/22 职场文书
2016大学迎新欢迎词
2015/09/29 职场文书