binascii --- 在二进制数据和 ASCII 之间进行转换¶
binascii 模块包含多个方法用来在二进制数据和多种 ASCII 编码的二进制数据表示形式之间进行转换。 在通常情况下,你不会直接使用这些函数而是使用 base64 这样的包装器模块作为替代。 binascii 模块包含用 C 语言编写的供这些高层级模块使用的低层级函数以获得更快的运行速度。
备注
a2b_* 函数接受只含有 ASCII 码的 Unicode 字符串。其他函数只接受 字节型对象 (如 bytes,bytearray 和其他支持缓冲区协议的对象)。
在 3.3 版本发生变更: ASCII-only unicode strings are now accepted by the a2b_* functions.
binascii 模块定义了下列函数:
- binascii.a2b_uu(string)¶
将单行 uu 编码数据转换成二进制数据并返回。uu 编码每行的数据通常包含 45 个(二进制)字节,最后一行除外。每行数据后面可能跟有空格。
- binascii.b2a_uu(data, *, backtick=False)¶
将二进制数据转换为 ASCII 编码字符,返回值是转换后的行数据,包括换行符。 data 的长度最多为 45。如果 backtick 为 true,则零由
'`'而不是空格表示。在 3.7 版本发生变更: 增加 backtick 形参。
- binascii.a2b_base64(string, /, *, padded=True, alphabet=BASE64_ALPHABET, strict_mode=False, canonical=False)¶
- binascii.a2b_base64(string, /, *, ignorechars, padded=True, alphabet=BASE64_ALPHABET, strict_mode=True, canonical=False)
将 base64 数据块转换成二进制并以二进制数据形式返回。一次可以传递多行数据。
可选的 alphabet 必须是一个长度为 64 的
bytes对象,指定替代字母表。如果 padded 为 true,则最后一组 4 个 base64 字母表字符必须用 ‘=’ 字符进行填充。如果 padded 为 false,则既不需要也不允许进行填充: ‘=’ 字符不会被视作填充字符,而是被视为非字母字符;这意味着当 strict_mode 为 false 时,该字符会被静默丢弃;若 strict_mode 为 true,则除非 ignorechars 中包含 b‘=’,否则会导致
Error错误。如果指定了 ignorechars,当 strict_mode 为 true 时,该变量应是一个 字节类对象,其中包含需要从输入中忽略的字符。如果 ignorechars 包含填充字符
'=',则会在编码数据末尾之前出现的填充字符以及多余的填充字符将被忽略。如果指定了 ignorechars,strict_mode 的默认值为True;否则,默认值为False。如果 strict_mode 为真值,则将只转换有效的 base64 数据。无效的 base64 数据将会引发
binascii.Error.有效的 base64:
遵循 RFC 4648。
仅包含来自 base64 字符表的字符。
不包含填充后的额外数据(包括冗余填充、换行符等)。
不以填充符打头。
如果 canonical 为真,则最后一组中的非零填充位会被
binascii.Error拒绝,从而强制执行 RFC 4648 第 3.5 节中定义的规范编码。此检查与 strict_mode 无关。在 3.11 版本发生变更: 增加了 strict_mode 形参。
在 3.15 版本发生变更: 新增了 alphabet、canonical、ignorechars 和 padded 参数。
- binascii.b2a_base64(data, *, padded=True, alphabet=BASE64_ALPHABET, wrapcol=0, newline=True)¶
将二进制数据转换为以 base64 编码的 ASCII 字符行(或多行),具体方式如 RFC 4648 中所述。
如果 padded 为(默认的)真值,则用 '=' 字符填充已编码数据长度为 4 的倍数。 如果 padded 为假值,则不添加填充字符。
如果 wrapcol 为非零值,则在至多每 wrapcol 个字符后插入一个换行符 (
b'\n')。 如果 wrapcol 为零(默认),则不插入换行符。如果 newline 为真(默认值),则会在输出末尾添加一个换行符。
在 3.6 版本发生变更: 增加 newline 形参。
在 3.15 版本发生变更: 增加了 alphabet, padded 和 wrapcol 形参。
- binascii.a2b_ascii85(string, /, *, foldspaces=False, adobe=False, ignorechars=b'', canonical=False)¶
将 Ascii85 数据转换回二进制,并返回二进制数据。
有效的 Ascii85 数据以每组五个字符的形式包含 Ascii85 字母表中的字符(最后一组除外,该组可包含两个至五个字符)。每组以
0至2 ** 32 - 1的范围内编码 32 位二进制数据,包含这两个端点。特殊字符z被接受为组!!!!!的简写形式;!!!!!用于编码四个连续的零字节。单字符的末组始终会被视为编码违规而予以拒绝。foldspaces 旗标指明是否应接受 'y' 短序列作为 4 个连续空格 (ASCII 0x20) 的快捷方式。此特性不被 "标准" Ascii85 编码格式所支持。
adobe 控制编码后的字节序列是否以
<~和~>包裹,就像 PostScript 的 base-85 字符串字面量那样。如果 adobe 为真,则开头的<~可选,而结尾的~>是*必需的*;若未找到,则会引发binascii.Error。ignorechars 应是一个 字节类对象,其中包含需要从输入中忽略的字符。该字段应仅包含空白字符。
如果 canonical 为真,则非规范编码会被
binascii.Error拒绝。此处“canonical”指的是b2a_ascii85()所生成的编码:对于全零组,必须使用z缩写(而非!!!!!);部分末位组则必须采用与编码器相同的填充位数。无效的 Ascii85 数据将触发
binascii.Error。在 3.15 版本加入.
- binascii.b2a_ascii85(data, /, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)¶
将二进制数据转换为采用 Ascii85 编码的格式化 ASCII 字符序列。返回值即为转换后的数据。
foldspaces 是一个可选的标志,使用特殊的短序列 'y' 代替 'btoa' 提供的 4 个连续空格 (ASCII 0x20)。这个特性不被 "标准" Ascii85 编码支持。
如果 wrapcol 为非零值,则在至多每 wrapcol 个字符后插入一个换行符 (
b'\n')。 如果 wrapcol 为零(默认),则不插入换行符。如果 pad 为真,则应用于输入末尾的零填充会在输出编码中完整保留,正如
btoa所实现的那样,从而产生精确为 5 字节倍数的输出。这不属于 PDF 所采用的标准编码的一部分,因为该方式不会保留数据的长度。adobe 控制编码后的字节序列是否像 PostScript base-85 字符串字面值那样用
<~和~>框起来。请注意,虽然 PDF 文档中的 ASCII85Decode 流 必须 以~>结尾,但它们 绝不能 使用前导<~。在 3.15 版本加入.
- binascii.a2b_base85(string, /, *, alphabet=BASE85_ALPHABET, ignorechars=b'', canonical=False)¶
将 Base85 数据转换回二进制,并返回二进制数据。一次可传递多条数据行。
有效的 Base85 数据以每组五个字符的形式包含 Base85 字母表中的字符(最后一组除外,该组可包含两个至五个字符)。每组可编码
0至2 ** 32 - 1(含)范围内的 32 位二进制数据。单个字符的末组始终会被视为编码违规而予以拒绝。可选的 alphabet 必须是一个长度为 85 的
bytes对象,用于指定替代字母表。ignorechars 应当是一个包含要从输入中忽略的字符的 bytes-like object。
如果 canonical 为真,则非规范编码会被
binascii.Error拒绝。此处“canonical”指的是b2a_base85()所生成的编码:部分最终组必须使用与编码器相同的填充数字。无效的 Base85 数据将触发
binascii.Error。在 3.15 版本加入.
- binascii.b2a_base85(data, /, *, alphabet=BASE85_ALPHABET, wrapcol=0, pad=False)¶
将二进制数据转换为采用 Base85 编码的 ASCII 字符行。返回值即为转换后的字符行。
可选的 alphabet 必须是一个长度为 85 的 字节类对象,用于指定替代字母表。
如果 wrapcol 为非零值,则在至多每 wrapcol 个字符后插入一个换行符 (
b'\n')。 如果 wrapcol 为零(默认),则不插入换行符。如果 pad 为真,则应用于输入末尾的零填充将保留在输出中;输出长度始终为 5 字节的整数倍,因此数据长度在解码时可能无法得到保留。
在 3.15 版本加入.
- binascii.a2b_base32(string, /, *, padded=True, alphabet=BASE32_ALPHABET, ignorechars=b'', canonical=False)¶
将 base32 数据转换回二进制,并返回二进制数据。
有效的 base32 数据由 RFC 4648 中指定的 base32 字母表字符组成,以每组八个字符的形式排列(如有必要,最后一组将以
=补齐至八个字符)。每组可编码0至2 ** 40 - 1(含)范围内的 40 位二进制数据。备注
此函数不会将小写字母(在标准 base32 中无效)映射为其对应的大写字母;也不会像 RFC 4648 所允许的那样,根据上下文将
0映射为O,将1映射为I/L。可选参数 alphabet 必须是一个长度为 32 的
bytes对象,用于指定替代字母表。如果 padded 为 true,则最后一组 8 个 base 32 字母字符必须用 ‘=’ 字符进行填充;如果 padded 为 false,则 ‘=’ 字符将被视为其他非字母字符(具体取决于 ignorechars 的值)。
ignorechars 应是一个包含待忽略字符的 字节类对象。如果 ignorechars 包含填充字符
'=',则会在编码数据末尾之前出现的填充字符以及多余的填充字符将被忽略。若 canonical 为真,则最后一组中的非零填充位将被
binascii.Error拒绝,从而强制执行 RFC 4648 第 3.5 节中定义的规范编码。无效的 base32 数据将触发
binascii.Error。在 3.15 版本加入.
- binascii.b2a_base32(data, /, *, padded=True, alphabet=BASE32_ALPHABET, wrapcol=0)¶
将二进制数据转换为以 base32 编码的 ASCII 字符行,具体方式如 RFC 4648 中所述。返回值即为转换后的字符行。
可选的 alphabet 必须是一个长度为 32 的 字节类对象,用于指定替代字母表。
如果 padded 为 true(默认值),则用 ‘=’ 字符对编码后的数据进行填充,使其长度成为 8 的倍数;如果 padded 为 false,则不添加填充字符。
如果 wrapcol 为非零值,则在至多每 wrapcol 个字符后插入一个换行符 (
b'\n')。 如果 wrapcol 为零(默认),则不插入换行符。在 3.15 版本加入.
- binascii.a2b_qp(data, header=False)¶
将一个引号可打印的数据块转换成二进制数据并返回。一次可以转换多行。如果可选参数 header 存在且为 true,则数据中的下划线将被解码成空格。
- binascii.b2a_qp(data, quotetabs=False, istext=True, header=False)¶
Convert binary data to a line(s) of ASCII characters in quoted-printable encoding. The return value is the converted line(s). If the optional argument quotetabs is present and true, all tabs and spaces will be encoded. If the optional argument istext is present and true, newlines are not encoded but trailing whitespace will be encoded. If the optional argument istext is present and false, newline characters will be encoded as well; otherwise linefeed conversion might corrupt the binary data stream. If the optional argument header is present and true, spaces will be encoded as underscores per RFC 1522.
- binascii.crc_hqx(data, value)¶
以 value 作为初始 CRC 计算 data 的 16 位 CRC 值,返回其结果。这里使用 CRC-CCITT 生成多项式 x16 + x12 + x5 + 1,通常表示为 0x1021。该 CRC 被用于 binhex4 格式。
- binascii.crc32(data[, value])¶
计算 CRC-32,即 data 的无符号 32 位校验和,初始 CRC 值为 value。默认的初始 CRC 值为零。该算法与 ZIP 文件校验和算法一致。由于该算法被设计用作校验和算法,因此不适合用作通用哈希算法。使用方式如下:
print(binascii.crc32(b"hello world")) # 或者,分成两块: crc = binascii.crc32(b"hello") crc = binascii.crc32(b" world", crc) print('crc32 = {:#010x}'.format(crc))
在 3.0 版本发生变更: 结果将总是不带符号的。
- binascii.b2a_hex(data[, sep[, bytes_per_sep=1]])¶
- binascii.hexlify(data[, sep[, bytes_per_sep=1]])¶
返回二进制数据 data 的十六进制表示形式。 data 的每个字节都被转换为相应的 2 位十六进制表示形式。因此返回的字节对象的长度是 data 的两倍。
使用
bytes.hex()方法也可以方便地实现相似的功能(但仅返回文本字符串)。如果指定了 sep,它必须为单字符 str 或 bytes 对象。它将被插入每个 bytes_per_sep 输入字节之后。 分隔符位置默认从输出的右端开始计数,如果你希望从左端开始计数,请提供一个负的 bytes_per_sep 值。
>>> import binascii >>> binascii.b2a_hex(b'\xb9\x01\xef') b'b901ef' >>> binascii.hexlify(b'\xb9\x01\xef', '-') b'b9-01-ef' >>> binascii.b2a_hex(b'\xb9\x01\xef', b'_', 2) b'b9_01ef' >>> binascii.b2a_hex(b'\xb9\x01\xef', b' ', -2) b'b901 ef'
在 3.8 版本发生变更: 添加了 sep 和 bytes_per_sep 形参。
- binascii.a2b_hex(hexstr, *, ignorechars=b'')¶
- binascii.unhexlify(hexstr, *, ignorechars=b'')¶
返回由十六进制字符串 hexstr 表示的二进制数据。此函数功能与
b2a_hex()相反。 hexstr 必须包含偶数个十六进制数字(可以是大写或小写),否则会引发Error异常。ignorechars 应当是一个包含要从输入中忽略的字符的 bytes-like object。
类似的功能(但对空白字符的处理更为宽松)也可以通过
bytes.fromhex()类方法实现。在 3.15 版本发生变更: 增加了 ignorechars 形参。
- exception binascii.Error¶
通常是因为编程错误引发的异常。
- exception binascii.Incomplete¶
数据不完整引发的异常。通常不是编程错误导致的,可以通过读取更多的数据并再次尝试来处理该异常。
- binascii.UU_ALPHABET¶
uuencoding 字符表。
在 3.15 版本加入.
- binascii.BINHEX_ALPHABET¶
在经典 Mac OS 内部 BinHex 4 (HQX) 中使用的 Base 64 字符表。
在 3.15 版本加入.
- binascii.BASE85_ALPHABET¶
Base85 字母表。
在 3.15 版本加入.
- binascii.ASCII85_ALPHABET¶
The Ascii85 字母表。
在 3.15 版本加入.