base64
— Base16、Base32、Base64、Base85 数据编码¶
源代码: Lib/base64.py
此模块提供了将二进制数据编码为可打印的 ASCII 字符以及将此类编码解码回二进制数据的功能。它为 RFC 4648 中指定的编码提供了编码和解码功能,该 RFC 定义了 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 (oh),以及可选地将数字 1(一)映射到字母 I(eye)或字母 L(el)。当 map01 不是
None
时,可选参数 map01 指定数字 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
。
- 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()
返回一个空的 bytes 对象。encode()
会在输出的每 76 个字节后插入一个换行符 (b'\n'
),并确保输出始终以换行符结尾,这符合 RFC 2045 (MIME)。
- base64.encodebytes(s)¶
对 类字节对象 s 进行编码,它可以包含任意二进制数据,并返回
bytes
,其中包含 base64 编码的数据,并在每 76 个输出字节后插入换行符 (b'\n'
),并确保末尾有一个换行符,这符合 RFC 2045 (MIME)。在 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 节) 中添加了一个新的安全注意事项部分;建议审查安全部分,以了解任何部署到生产环境的代码。