base64
— Base16、Base32、Base64、Base85 数据编码¶
源代码: Lib/base64.py
此模块提供了将二进制数据编码为可打印 ASCII 字符以及将这些编码解码回二进制数据的函数。这包括 在 RFC 4648 中指定的编码(Base64、Base32 和 Base16)以及非标准的 Base85 编码。
此模块提供了两种接口。现代接口支持将 类字节对象 编码为 ASCII bytes
,并将 类字节对象 或包含 ASCII 的字符串解码为 bytes
。支持 RFC 4648 中定义的两种 base-64 字母表(标准字母表,以及 URL 和文件系统安全字母表)。
传统接口 不支持从字符串解码,但它提供了用于对 文件对象 进行编码和解码的函数。它只支持 Base64 标准字母表,并根据 RFC 2045 的规定每 76 个字符添加一个换行符。请注意,如果你正在寻找 RFC 2045 支持,你可能应该查看 email
包。
在 3.3 版更改: 现代接口的解码函数现在接受仅含 ASCII 的 Unicode 字符串。
在 3.4 版更改: 此模块中的所有编码和解码函数现在都接受任何 类字节对象。添加了对 Ascii85/Base85 的支持。
RFC 4648 编码¶
RFC 4648 编码适用于对二进制数据进行编码,以便可以通过电子邮件安全发送、用作 URL 的一部分,或作为 HTTP POST 请求的一部分包含在内。
- base64.b64encode(s, altchars=None)¶
使用 Base64 对 类字节对象 s 进行编码,并返回编码后的
bytes
。可选的 altchars 必须是长度为 2 的 类字节对象,用于指定
+
和/
字符的替代字母表。这允许应用程序生成例如 URL 或文件系统安全的 Base64 字符串。默认值为None
,此时使用标准的 Base64 字母表。如果 altchars 的长度不为 2,可能会断言或引发
ValueError
。如果 altchars 不是 类字节对象,则引发TypeError
。
- base64.b64decode(s, altchars=None, validate=False)¶
解码 Base64 编码的 类字节对象 或 ASCII 字符串 s,并返回解码后的
bytes
。可选的 altchars 必须是长度为 2 的 类字节对象 或 ASCII 字符串,用于指定替代
+
和/
字符的替代字母表。如果 s 的填充不正确,则会引发
binascii.Error
异常。如果 validate 为
False
(默认值),那么在填充检查之前,既不在标准 base-64 字母表中也不在替代字母表中的字符将被丢弃。如果 validate 为True
,输入中的这些非字母表字符将导致binascii.Error
。关于严格的 base64 检查的更多信息,请参见
binascii.a2b_base64()
如果 altchars 的长度不为 2,可能会断言或引发
ValueError
。
- base64.urlsafe_b64encode(s)¶
使用 URL 和文件系统安全的字母表对 类字节对象 s 进行编码,该字母表在标准 Base64 字母表中用
-
替换+
,用_
替换/
,并返回编码后的bytes
。结果仍然可能包含=
。
- base64.urlsafe_b64decode(s)¶
使用 URL 和文件系统安全的字母表解码 类字节对象 或 ASCII 字符串 s,该字母表在标准 Base64 字母表中用
-
替换+
,用_
替换/
,并返回解码后的bytes
。
- base64.b32decode(s, casefold=False, map01=None)¶
解码 Base32 编码的 类字节对象 或 ASCII 字符串 s,并返回解码后的
bytes
。可选的 casefold 是一个标志,指定是否接受小写字母表作为输入。出于安全考虑,默认值为
False
。RFC 4648 允许将数字 0(零)可选地映射到字母 O(oh),并将数字 1(一)可选地映射到字母 I(eye)或字母 L(el)。可选参数 map01 在不为
None
时,指定数字 1 应该映射到哪个字母(当 map01 不为None
时,数字 0 总是映射到字母 O)。出于安全考虑,默认值为None
,因此输入中不允许出现 0 和 1。如果 s 的填充不正确或输入中存在非字母表字符,则会引发
binascii.Error
。
- base64.b32hexencode(s)¶
类似于
b32encode()
,但使用 RFC 4648 中定义的扩展十六进制字母表。在 3.10 版本加入。
- base64.b32hexdecode(s, casefold=False)¶
类似于
b32decode()
,但使用 RFC 4648 中定义的扩展十六进制字母表。此版本不允许将数字 0(零)映射到字母 O(oh),也不允许将数字 1(一)映射到字母 I(eye)或字母 L(el),所有这些字符都包含在扩展十六进制字母表中,并且不可互换。
在 3.10 版本加入。
- base64.b16decode(s, casefold=False)¶
解码 Base16 编码的 类字节对象 或 ASCII 字符串 s,并返回解码后的
bytes
。可选的 casefold 是一个标志,指定是否接受小写字母表作为输入。出于安全考虑,默认值为
False
。如果 s 的填充不正确或输入中存在非字母表字符,则会引发
binascii.Error
。
Base85 编码¶
Base85 编码没有正式规定,而是一种事实上的标准,因此不同的系统执行编码的方式不同。
此模块中的 a85encode()
和 b85encode()
函数是这个事实标准的两种实现。你应该调用与你打算使用的软件所使用的 Base85 实现相匹配的函数。
此模块中提供的两个函数在处理以下方面有所不同
是否包含
<~
和~>
标记是否包含换行符
用于编码的 ASCII 字符集
处理空字节
有关更多信息,请参考各个函数的文档。
- base64.a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)¶
使用 Ascii85 对 类字节对象 b 进行编码,并返回编码后的
bytes
。foldspaces 是一个可选标志,它使用特殊的短序列 'y' 来代替 4 个连续的空格 (ASCII 0x20),这是 'btoa' 所支持的。这个特性不被“标准”Ascii85 编码所支持。
wrapcol 控制输出是否应添加换行符 (
b'\n'
)。如果该值非零,则每个输出行的长度最多为此字符数,不包括末尾的换行符。pad 控制在编码前是否将输入填充到 4 的倍数。请注意,
btoa
实现总是进行填充。adobe 控制编码后的字节序列是否用
<~
和~>
括起来,这是 Adobe 实现所使用的。在 3.4 版本加入。
- base64.a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\x0b')¶
解码 Ascii85 编码的 类字节对象 或 ASCII 字符串 b,并返回解码后的
bytes
。foldspaces 是一个标志,指定是否应接受 'y' 短序列作为 4 个连续空格 (ASCII 0x20) 的简写。这个特性不被“标准”Ascii85 编码所支持。
adobe 控制输入序列是否为 Adobe Ascii85 格式(即用 <~ 和 ~> 括起来)。
ignorechars 应该是一个 类字节对象 或 ASCII 字符串,包含要从输入中忽略的字符。它应该只包含空白字符,默认情况下包含 ASCII 中的所有空白字符。
在 3.4 版本加入。
传统接口¶
- base64.decode(input, output)¶
解码二进制 input 文件的内容,并将生成的二进制数据写入 output 文件。input 和 output 必须是 文件对象。将一直读取 input,直到
input.readline()
返回一个空的字节对象。
- base64.encode(input, output)¶
编码二进制 input 文件的内容,并将生成的 base64 编码数据写入 output 文件。input 和 output 必须是 文件对象。将一直读取 input,直到
input.read()
返回一个空的字节对象。根据 RFC 2045 (MIME) 的规定,encode()
在输出的每 76 个字节后插入一个换行符 (b'\n'
),并确保输出始终以换行符结尾。
- base64.encodebytes(s)¶
编码 类字节对象 s,它可以包含任意二进制数据,并返回包含 base64 编码数据的
bytes
,根据 RFC 2045 (MIME) 的规定,在输出的每 76 个字节后插入换行符 (b'\n'
),并确保有一个尾随换行符。在 3.1 版本加入。
模块用法示例
>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
>>> data = base64.b64decode(encoded)
>>> data
b'data to be encoded'
安全考虑¶
RFC 4648 中增加了一个新的安全考虑章节(第 12 节);建议审查任何部署到生产环境的代码的安全部分。