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 异常。

如果 validateFalse (默认值),那么在填充检查之前,既不在标准 base-64 字母表中也不在替代字母表中的字符将被丢弃。如果 validateTrue,输入中的这些非字母表字符将导致 binascii.Error

关于严格的 base64 检查的更多信息,请参见 binascii.a2b_base64()

如果 altchars 的长度不为 2,可能会断言或引发 ValueError

base64.standard_b64encode(s)

使用标准 Base64 字母表对 类字节对象 s 进行编码,并返回编码后的 bytes

base64.standard_b64decode(s)

使用标准 Base64 字母表解码 类字节对象 或 ASCII 字符串 s,并返回解码后的 bytes

base64.urlsafe_b64encode(s)

使用 URL 和文件系统安全的字母表对 类字节对象 s 进行编码,该字母表在标准 Base64 字母表中用 - 替换 +,用 _ 替换 /,并返回编码后的 bytes。结果仍然可能包含 =

base64.urlsafe_b64decode(s)

使用 URL 和文件系统安全的字母表解码 类字节对象 或 ASCII 字符串 s,该字母表在标准 Base64 字母表中用 - 替换 +,用 _ 替换 /,并返回解码后的 bytes

base64.b32encode(s)

使用 Base32 对 类字节对象 s 进行编码,并返回编码后的 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.b16encode(s)

使用 Base16 对 类字节对象 s 进行编码,并返回编码后的 bytes

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.b85encode(b, pad=False)

使用 base85(例如在 git 风格的二进制差异中使用的)对 类字节对象 b 进行编码,并返回编码后的 bytes

如果 pad 为 true,则在编码前用 b'\0' 填充输入,使其长度是 4 字节的倍数。

在 3.4 版本加入。

base64.b85decode(b)

解码 base85 编码的 类字节对象 或 ASCII 字符串 b,并返回解码后的 bytes。如有必要,填充会被隐式移除。

在 3.4 版本加入。

base64.z85encode(s)

使用 Z85(如 ZeroMQ 中使用的)对 类字节对象 s 进行编码,并返回编码后的 bytes。更多信息请参见 Z85 规范

在 3.13 版本加入。

base64.z85decode(s)

解码 Z85 编码的 类字节对象 或 ASCII 字符串 s,并返回解码后的 bytes。更多信息请参见 Z85 规范

在 3.13 版本加入。

传统接口

base64.decode(input, output)

解码二进制 input 文件的内容,并将生成的二进制数据写入 output 文件。inputoutput 必须是 文件对象。将一直读取 input,直到 input.readline() 返回一个空的字节对象。

base64.decodebytes(s)

解码 类字节对象 s,该对象必须包含一行或多行 base64 编码的数据,并返回解码后的 bytes

在 3.1 版本加入。

base64.encode(input, output)

编码二进制 input 文件的内容,并将生成的 base64 编码数据写入 output 文件。inputoutput 必须是 文件对象。将一直读取 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 节);建议审查任何部署到生产环境的代码的安全部分。

参见

模块 binascii

包含 ASCII 到二进制和二进制到 ASCII 转换的支持模块。

RFC 1521 - MIME(多用途互联网邮件扩展)第一部分:指定和描述互联网邮件正文格式的机制

第 5.2 节,“Base64 内容传输编码”,提供了 base64 编码的定义。