在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代码真的很爽
Aug 26 Python
python生成器的使用方法
Nov 21 Python
在Python中定义和使用抽象类的方法
Jun 30 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
Jul 08 Python
Python动刷新抢12306火车票的代码(附源码)
Jan 24 Python
Python实现购物车购物小程序
Apr 18 Python
Python中collections模块的基本使用教程
Dec 07 Python
Python3.5字符串常用操作实例详解
May 01 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
Aug 21 Python
解决python彩色螺旋线绘制引发的问题
Nov 23 Python
python 批量压缩图片的脚本
Jun 02 Python
python 实现两个变量值进行交换的n种操作
Jun 02 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 strcmp使用说明
2010/04/22 PHP
PHPExcel读取Excel文件的实现代码
2011/12/06 PHP
php实现可运算的验证码
2015/11/10 PHP
PHP获取网页所有连接的方法(附demo源码下载)
2016/03/30 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
WEB高性能开发之疯狂的HTML压缩
2010/06/19 Javascript
jQuery之尺寸调整组件的深入解析
2013/06/19 Javascript
js中substring和substr的详细介绍与用法
2013/08/29 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
javascript获取函数名称、函数参数、对象属性名称的代码实例
2014/04/12 Javascript
JavaScript中的普通函数与构造函数比较
2015/04/07 Javascript
JavaScript数组去重的3种方法和代码实例
2015/07/01 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
js css实现垂直方向自适应的三角提示菜单
2016/06/26 Javascript
Vue.js中用v-bind绑定class的注意事项
2016/12/13 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
2017/06/19 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
bootstrap 通过加减按钮实现输入框组功能
2017/11/15 Javascript
移动web开发之touch事件实例详解
2018/01/17 Javascript
简单通过settimeout看javascript的运行机制
2019/05/10 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
vue实现公告栏文字上下滚动效果的示例代码
2020/06/16 Javascript
Python中对象迭代与反迭代的技巧总结
2016/09/17 Python
Python实现比较扑克牌大小程序代码示例
2017/12/06 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
python装饰器原理与用法深入详解
2019/12/19 Python
tensorflow之自定义神经网络层实例
2020/02/07 Python
在pycharm中文件取消用 pytest模式打开的操作
2020/09/01 Python
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
文化建设工作方案
2014/05/12 职场文书
群众路线调研报告范文
2014/11/03 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
创业计划书之家教托管
2019/09/25 职场文书
oracle通过存储过程上传list保存功能
2021/05/12 Oracle