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

如果 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 时,可选参数 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.b16encode(s)

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

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.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() 返回一个空的 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 节) 中添加了一个新的安全注意事项部分;建议审查安全部分,以了解任何部署到生产环境的代码。

另请参阅

模块 binascii

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

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

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