在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下载FTP上的文件夹的实现代码
Feb 10 Python
python采集博客中上传的QQ截图文件
Jul 18 Python
Python多线程编程(一):threading模块综述
Apr 05 Python
正确理解python中的关键字“with”与上下文管理器
Apr 21 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
pandas.DataFrame.to_json按行转json的方法
Jun 05 Python
Python imread、newaxis用法详解
Nov 04 Python
Python3.7 读取音频根据文件名生成脚本的代码
Apr 07 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
使用TensorBoard进行超参数优化的实现
Jul 06 Python
Python max函数中key的用法及原理解析
Jun 26 Python
Django数据库(SQlite)基本入门使用教程
Jul 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执行zip与rar解压缩方法实现代码
2010/12/05 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
YII中assets的使用示例
2014/07/31 PHP
php验证session无效的解决方法
2014/11/04 PHP
php生成excel列名超过26列大于Z时的解决方法
2014/12/29 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
JS 控制非法字符的输入代码
2009/12/04 Javascript
基于jquery实现的可以编辑选择的下拉框的代码
2010/11/19 Javascript
jquery利用命名空间移除绑定事件的方法
2015/03/11 Javascript
JavaScript设计模式学习之“类式继承”
2015/03/12 Javascript
js实现瀑布流的三种方式比较
2020/06/28 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
js提示框替代系统alert,自动关闭alert对话框的实现方法
2016/11/07 Javascript
微信小程序自定义组件
2017/08/16 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
vue-router两种模式区别及使用注意事项详解
2019/08/01 Javascript
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
浅谈python对象数据的读写权限
2016/09/12 Python
python实现决策树
2017/12/21 Python
详解python多线程、锁、event事件机制的简单使用
2018/04/27 Python
Python闭包函数定义与用法分析
2018/07/20 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
python自定义函数def的应用详解
2020/06/03 Python
HTML5 和小程序实现拍照图片旋转、压缩和上传功能
2018/10/08 HTML / CSS
JSF的标签库有哪些
2012/04/27 面试题
大学生标准推荐信范文
2013/11/25 职场文书
巧克力蛋糕店创业计划书
2014/01/14 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
公司周年庆典致辞
2015/07/30 职场文书
2016党员干部廉洁自律心得体会
2016/01/13 职场文书
php双向队列实例讲解
2021/11/17 PHP
openstack云计算keystone组件工作介绍
2022/04/20 Servers