# 19.6. `base64` - Base16，Base32，Base64，Base85数据编码

源代码： Lib/base64.py

此模块提供将二进制数据编码为可打印ASCII字符并将此类编码解码回二进制数据的功能。它为在 RFC 3548中指定的编码提供编码和解码功能，该编码定义了Base16，Base32和Base64算法，以及事实上的标准Ascii85和Base85编码。

RFC 3548编码适用于编码二进制数据，以便它可以安全地通过电子邮件发送，用作URL的一部分，或作为HTTP POST请求的一部分。其编码算法与uuencode程序不同。

此模块提供两个接口。现代接口支持将类字节对象编码为ASCII`字节`，以及将类字节对象或包含ASCII的字符串解码为`字节`。RFC 3548中定义的两个基本64字母表（普通字母表，和URL及文件系统安全的字母表）都支持。

传统接口不支持从字符串进行解码，但它提供从文件对象编码和解码的功能。它仅支持Base64标准字母表，并根据 RFC 2045每76个字符添加换行符。请注意，如果你要查找 RFC 2045支持，你可能希望查看`email`包。

在版本3.3中更改：现代接口的解码函数现在接受ASCII-only的Unicode字符串。

在版本3.4中更改：现在此模块中的所有编码和解码函数接受任何类字节对象。添加对Ascii85/Base85的支持。

现代接口提供：

`base64.``b64encode`(s, altchars=None)

  使用Base64编码类字节对象 s，并返回编码后的`字节`。

  可选的altchars必须是一个类字节对象，长度至少为2（忽略其他字符），它指定`+`和`/`字符的替代字母。这允许应用生成URL或文件系统安全的Base64字符串。默认值为`None`，使用标准的Base64字母表。

`base64.``b64decode`(s, altchars=None, validate=False)

  解码Base64编码的类字节对象或ASCII字符串s并返回解码的`字节`。

  可选的altchars必须是一个类字节对象，长度至少为2（忽略其他字符），它指定`+`和`/`字符的替代字母。

  如果s未正确填充，则引发`binascii.Error`异常。

  如果validate是`False`（默认值），则在填充检查之前，将不在正常base-64字母表中或替代字母表中的字符丢弃。如果validate是`True`，则输入中的这些非字母字符会导致`binascii.Error`。

`base64.``standard_b64encode`(s)

  使用标准的Base64字母表编码类字节对象 s并返回编码的`字节`。

`base64.``standard_b64decode`(s)

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

`base64.``urlsafe_b64encode`(s)

  使用URL和文件系统安全的字母表编码类字节对象 s，它用`-`和`_`分别替换标准的Base64字母表中的`+`和`/`，并返回编码的`字节`。结果仍可包含`=`。

`base64.``urlsafe_b64decode`(s)

  使用URL及文件系统安全的字母表解码类字节对象或ASCII字符串s，它将标准Base64字母表中的`+`替换为`-`、`/`替换为`_`，并返回解码后的`字节`。

`base64.``b32encode`(s)

  使用Base32编码类字节对象 s并返回编码后的`字节`。

`base64.``b32decode`(s, casefold=False, map01=None)

  解码Base32编码的bytes-like object或ASCII字符串s并返回解码的`bytes`。

  可选casefold是指定是否可接受小写字母作为输入的标志。出于安全考虑，默认值为`False`。

  RFC 3548允许将数字0（零）可选地映射到字母O（oh），并且可选地将数字1（一）映射到字母I（eye）或字母L（el）。可选参数map01不为`None`时，指定数字1应映射到哪个字母（当map01不为`None`时，数字0始终映射到字母O）。为了安全起见，默认值为`None`，因此输入中不允许0和1。

  如果s未正确填充或输入中存在非字母字符，则会引发`binascii.Error`。

`base64.``b16encode`(s)

  使用Base16编码bytes-like object s并返回编码的`bytes`。

`base64.``b16decode`(s, casefold=False)

  解码Base16编码的bytes-like object或ASCII字符串s并返回解码的`bytes`。

  可选casefold是指定是否可接受小写字母作为输入的标志。出于安全考虑，默认值为`False`。

  如果s未正确填充或输入中存在非字母字符，则会引发`binascii.Error`。

`base64.``a85encode`(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)

  使用Ascii85编码bytes-like object b并返回编码的`bytes`。

  折叠空间是一个可选标志，使用特殊短序列“y”，而不是“btoa”支持的4个连续空格（ASCII 0x20）。“标准”Ascii85编码不支持此功能。

  wrapcol控制输出是否应该添加换行符（`b'\n'`）。如果这是非零，每个输出行将最多这个许多字符长。

  pad控制输入在编码之前是否填充为4的倍数。注意，`btoa`实现总是垫。

  adobe控制编码后的字节序列是否用`<~` and `~>`包围，用于Adobe实现。

  新版本3.4。

`base64.``a85decode`(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\v')

  解码Ascii85编码的bytes-like object或ASCII字符串b并返回解码的`bytes`。

  折叠空间是指定是否应接受“y”短序列作为4个连续空格（ASCII 0x20）的缩写的标志。“标准”Ascii85编码不支持此功能。

  adobe控制输入序列是否为Adobe Ascii85格式（即框架）。

  ignorechars应为bytes-like object或包含要从输入忽略的字符的ASCII字符串。这应该只包含空格字符，并且默认包含ASCII中的所有空格字符。

  新版本3.4。

`base64.``b85encode`(b, pad=False)

  使用base85编码bytes-like object b（如 git-style binary diffs）并返回编码的`bytes`。

  如果pad为真，则输入用`b'\0'`填充，因此其长度是编码前的4个字节的倍数。

  新版本3.4。

`base64.``b85decode`(b)

  解码base85编码的bytes-like object或ASCII字符串b并返回解码的`bytes`。如果需要，隐含地删除填充。

  新版本3.4。

注意

Base85和Ascii85都有5到4的扩展因子（5个Base85或Ascii85字符可以编码4个二进制字节），而更好的Base64扩展因子为6到4。因此，当空间昂贵时，它们更有效。它们因细节（例如用于编码的字符映射）而不同。

传统接口：

`base64.``decode`(input, output)

  解码二进制输入文件的内容，并将生成的二进制数据写入输出文件。输入和输出必须是file objects。输入将被读取，直到`input.readline()`返回一个空字节对象。

`base64.``decodebytes`(s)
`base64.``decodestring`(s)

  解码bytes-like object s，其中必须包含一行或多行base64编码数据，并返回解码的`bytes`。`decodestring`是一个已弃用的别名。

  版本3.1中的新功能。

`base64.``encode`(input, output)

  编码二进制输入文件的内容，并将生成的base64编码数据写入输出文件。输入和输出必须是file objects。输入将被读取，直到`input.read()`返回一个空字节对象。`encode()`在输出的每76个字节后插入一个换行符（`b'\n'`），以及确保输出总是以换行符结束每 RFC 2045（MIME）。

`base64.``encodebytes`(s)
`base64.``encodestring`(s)

  编码类字节对象 s，它可以包含任意二进制数据，并返回base64编码数据的`字节`，根据 RFC 2045 （MIME），在输出的每76个字节之后插入换行符（`b'\n'`），并确保末尾有一个换行符。

  `encodestring`是已弃用的别名。

模块的示例用法：

    >>> import base64
    >>> encoded = base64.b64encode(b'data to be encoded')
    >>> encoded
    b'ZGF0YSB0byBiZSBlbmNvZGVk'
    >>> data = base64.b64decode(encoded)
    >>> data
    b'data to be encoded'

也可以看看

模块`binascii`
  支持模块包含ASCII到二进制和二进制到ASCII转换。
RFC 1521 - MIME（多用途互联网邮件扩展）第一部分：指定和描述互联网消息机构格式的机制
  第5.2节“Base64内容传输编码”提供了base64编码的定义。