Python base64模块详解:编码解码与各类变体用法

许南星
许南星
发布时间:2026-10-14 | 2人浏览过
原创

本文详细解析Python中base64模块的使用方法,涵盖b64encode/b64decode、Base32、Base16、Base85及Ascii85等编码标准。重点介绍参数如altchars、validate、casefold及pad的作用,并说明旧版API的兼容性与废弃情况,帮助开发者高效处理二进制数据编码。

前言与背景

前言

此前团队学妹咨询了关于POP3协议的问题,因此笔者对POP3协议的格式及Python中的poplib模块进行了简要研究。在POP服务器返回的数据中,部分信息需要通过Base64进行解码,这促使笔者进一步探究Python内置的base64模块。

本文首先介绍base64模块,该模块提供了针对Base16、Base32、Base64、Base85以及Ascii85的编码与解码相关函数。关于poplib模块的具体内容将在后续文章中补充。看来又挖了一个新坑,之前的坑似乎永远填不完……

以下内容摘自http://bbs.chinaunix.net/thread-1150250-1-1.html,详细解释了为何回传数据需先经过Base64编码:

由于历史原因,Internet上部分邮件系统仅支持7Bit字符传输,而汉字内码为8Bit。当通过仅支持7Bit的邮件系统发送中文时,汉字内码的第八位元(最高位)的1会被全部清零。以“中文”二字为例,其HEX值为A4A4A4E5,当最高位元被清零后变为24242465,即显示为“$$$e”。telnet也存在类似问题。

除中文邮件外,通过电子邮件发送图片、程序代码或压缩文件时也会遇到相同问题。因此,电子邮件中通常采用各种邮件编码方式来解决此问题,将8Bit数据按特定规则编码,从而顺利通过仅支持7Bit字符的邮件系统。

常见的邮件编码包括UU与MIME。MIME(Multipurpose Internet Mail Extentions,多用途互联网邮件扩展)顾名思义,旨在支持发送多媒体格式文件,允许在一封邮件中附加并发送各种类型的文件。

MIME定义了两种编码方法:Base64与QP(Quote-Printable),两者适用场景不同。QP规则规定,对于数据中的7Bit部分无需重复编码,仅将8Bit数据转换为7Bit。QP编码适用于非US-ASCII文字内容,如中文文件;而Base64编码规则是将整个文件重新编码为7Bit,主要用于传输二进制文件。由于编码方式不同,会影响编码后文件大小。部分软件为简化处理,一律采用Base64编码。

Base64编码详解

Base64

base64模块提供了6个函数用于Base64的编码和解码,可将其分为三组。

base64.b64encode(s, altchars=None) base64.b64decode(s, altchars=None, validate=False)

参数s代表需要编码或解码的数据。其中,b64encode的参数s类型必须为字节包(bytes);b64decode的参数s可以是字节包(bytes),也可以是字符串(str)。

由于Base64编码后的数据中可能包含'+'或'/'符号,若编码后的数据用于URL或文件系统路径中,可能导致Bug。因此,base64模块提供了替换编码后数据中'+'和'/'的方法。

参数altchars必须是长度为2的字节包,用于替换编码后数据中的'+'和'/'。该参数默认值为None。

参数validate默认为False。若设为True,base64模块在解码前会检查s中是否包含非Base64字母表中的字符,若存在则抛出错误binascii.Error: Non-base64 digit found。

若数据长度不正确,则会抛出错误binascii.Error: Incorrect padding。


>>> import base64
>>> x = base64.b64encode(b'test')
>>> x
b'dGVzdA=='
>>> base64.b64decode(x)
b'test'

base64.standard_b64encode(s) base64.standard_b64decode(s)

这组函数直接将参数s传递给上一组函数处理。

base64.urlsafe_b64encode(s) base64.urlsafe_b64decode(s)

这组函数同样基于第一组函数,但编码后会将输出数据中的'+'和'/'替换为'-'和'_'。解码前则将数据中的'-'和'_'替换回'+'和'/'。

此外,Base64编码还会产生符号'=',该符号用于将数据长度填充至4的倍数。

Base32编码与参数

Base32

base64.b32encode(s) base64.b32decode(s, casefold=False, map01=None)

参数s与Base64一致。

Base32编码后的字符范围为[2-7A-Z],不支持小写字母。但当参数casefold为True时,Base32解码可接受小写字母输入。出于安全考虑,该参数默认值为False。

Base32解码还允许将数字0替换为大写字母O,将数字1替换为大写字母I或L。参数map01可指定将数字1替换为哪个字符(源码中未限定必须为I或L之一)。当该参数非None时,数字0始终会被替换为字母O。同样出于安全考虑,该参数默认值为None。

Base16编码

Base16

base64.b16encode(s) base64.b16decode(s, casefold=False)

Base16编码后的字符范围为[0-9A-F]。

参数s和casefold的作用与Base32一致。

Base85与Ascii85编码

Base85

base64.b85encode(b, pad=False) base64.b85decode(b)

参数b为用于编码/解码的数据,类型要求与Base64的参数s一致。

当参数pad为True时,编码前会用b'\0'将数据填充至长度为4的倍数。但在解码时不会移除这些填充数据。

这组函数是在Python3.4之后新增的。

Ascii85

base64.a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)

参数b为用于编码的数据,类型必须为bytes。

当参数foldspaces为True时,会用b'y'表示4个连续的空格。

参数wrapcol为整数,当wrapcol非0时,该整数控制编码后输出每多少个字符添加一个换行符b'\n'。

当参数pad为True时,数据在编码前会用b'\0'填充至长度为4的倍数。解码时不会移除这些填充数据。

参数adobe指定数据是否采用Adobe格式。Adobe Ascii85的编码数据由<\~和\~>包围,若该参数为True,返回的数据将加上这对符号。

base64.a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\v')

参数b为用于编码的数据,类型可以为bytes或str。

当参数foldspaces为True时,会用b'y'表示4个连续的空格。

参数adobe指定数据是否采用Adobe格式。Adobe Ascii85的编码数据由<\~和\~>包围,若该参数为True,解码前base64会先移除这对符号。

参数ignorechars指定了解码时需要忽略的字符,默认包含ASCII中所有空白符。

这组函数是在Python3.4之后新增的。

base64模块官方文档指出:Base85和Ascii85使用5个字符编码4个字节,而Base64使用6个字符编码4个字节(实际上是4个字符编码3个字节)。当空间不充裕时,前两者比Base64更高效。

旧版API说明

旧API

base64仍保留了一部分旧API,用于某些特殊用途。

base64.encode(input, output) base64.decode(input, output)

这组函数以二进制文件作为数据源,并将编码/解码后的数据写入二进制文件。

base64.encodebytes(s) base64.decodebytes(s)

encodebytes和b64encode在内部均调用binascii模块的b2a_base64,区别在于encodebytes调用b2a_base64时newline参数使用默认值True。即,encodebytes在输出数据时,每76个字节会添加一个换行符b'\n'。

decodebytes与默认参数下的b64decode基本一致,仅参数类型检查不同,decodebytes仅支持bytes类型数据。

base64.encodestring(s) base64.decodestring(s)

这组函数在Python3.1之后已废弃,目前直接调用上一组函数。

总结

总结

base64模块提供了对二进制数据进行编码的接口,包括标准的Base64、Base32、Base16以及事实标准的Ascii85和Base85。通过学习该模块,笔者顺便了解了二进制数据编码的各种细节,感受颇深。有时我们自以为了解计算机和互联网,其实每个人看到的只是沧海一粟,不值一提。这个领域对笔者而言仍有诸多未知,值得继续探索,而探索的脚步不会停止。

以上就是本文关于Python使用base64模块进行二进制数据编码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续查阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表