base64
— Base16、Base32、Base64、Base85 数据编码¶
源代码: Lib/base64.py
此模块提供了用于将二进制数据编码为可打印 ASCII 字符以及将此类编码解码回二进制数据的函数。它为 RFC 4648 中指定的编码(定义了 Base16、Base32 和 Base64 算法)以及事实上的标准 Ascii85 和 Base85 编码提供了编码和解码函数。
RFC 4648 编码适用于对二进制数据进行编码,以便可以通过电子邮件安全地发送、用作 URL 的一部分或作为 HTTP POST 请求的一部分包含在内。编码算法与 uuencode 程序不同。
此模块提供了两个接口。现代接口支持将 类字节对象 编码为 ASCII bytes
,并将包含 ASCII 的 类字节对象 或字符串解码为 bytes
。支持 RFC 4648 中定义的两个 base-64 字母表(正常字母表以及 URL 和文件系统安全字母表)。
旧版接口不支持从字符串解码,但它确实提供了用于对 文件对象 进行编码和解码的函数。它仅支持 Base64 标准字母表,并且根据 RFC 2045 每 76 个字符添加换行符。请注意,如果您正在寻找 RFC 2045 支持,您可能应该查看 email
包。
在 3.3 版更改: 现代接口的解码函数现在接受仅 ASCII 的 Unicode 字符串。
在 3.4 版更改: 此模块中的所有编码和解码函数现在都接受任何 类字节对象。添加了 Ascii85/Base85 支持。
现代接口提供
- 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(欧),并将数字 1(一)可选地映射到字母 I(艾)或字母 L(埃尔)。当可选参数 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(欧),也不允许将数字 1(一)映射到字母 I(艾)或字母 L(埃尔),所有这些字符都包含在扩展十六进制字母表中,并且不可互换。
3.10 版新增。
- base64.b16decode(s, casefold=False)¶
解码 Base16 编码的 类字节对象 或 ASCII 字符串 s,并返回解码后的
bytes
。可选参数 casefold 是一个标志,用于指定是否接受小写字母作为输入。出于安全考虑,默认值为
False
。如果 s 的填充不正确或输入中存在非字母字符,则会引发
binascii.Error
。
- 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.b85encode(b, pad=False)¶
使用 base85(例如,在 git 风格的二进制差异中使用)对类字节对象 *b* 进行编码,并返回编码后的
bytes
。如果 *pad* 为 true,则在编码之前,输入将使用
b'\0'
填充,使其长度为 4 个字节的倍数。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 部分);建议查看部署到生产环境的任何代码的安全部分。