binascii
— 二进制和 ASCII 互转¶
binascii
模块包含许多在二进制和各种 ASCII 编码的二进制表示法之间转换的方法。通常情况下,你不会直接使用这些函数,而是使用包装模块,如 base64
。 binascii
模块包含了由更高级别的模块所使用的,用 C 语言编写的底层函数,因而速度更快。
备注
a2b_*
函数接受只包含 ASCII 字符的 Unicode 字符串。其他函数只接受 类字节对象 (例如 bytes
、bytearray
以及其他支持缓冲区协议的对象)。
在 3.3 版本发生变更: a2b_*
函数现在接受只含 ASCII 字符的 unicode 字符串。
binascii
模块定义了以下函数:
- binascii.a2b_uu(string)¶
将一行 uuencode 编码的数据转回二进制并返回该二进制数据。每行通常包含 45 个(二进制)字节,最后一行除外。行数据后面可能跟有空白字符。
- binascii.b2a_uu(data, *, backtick=False)¶
将二进制数据转换为一行 ASCII 字符,返回值是转换后的行,包含一个换行符。data 的长度最多应为 45。如果 backtick 为 true,则零值将用
'`'
而非空格来表示。在 3.7 版本发生变更: 添加了 backtick 参数。
- binascii.a2b_base64(string, /, *, strict_mode=False)¶
将一块 base64 数据转回二进制并返回该二进制数据。可以一次传递多行。
如果 strict_mode 为 true,则只会转换有效的 base64 数据。无效的 base64 数据将引发
binascii.Error
。有效的 base64
符合 RFC 3548。
只包含 base64 字母表中的字符。
填充(padding)后不包含多余的数据(包括多余的填充、换行符等)。
不以填充开头。
在 3.11 版本发生变更: 添加了 strict_mode 参数。
- binascii.b2a_base64(data, *, newline=True)¶
将二进制数据转换为一行 base64 编码的 ASCII 字符。返回值是转换后的行,如果 newline 为 true,则包含一个换行符。此函数的输出符合 RFC 3548。
在 3.6 版本发生变更: 添加了 newline 形参。
- binascii.a2b_qp(data, header=False)¶
将一块 quoted-printable 数据转回二进制并返回该二进制数据。可以一次传递多行。如果可选参数 header 存在且为 true,下划线将被解码为空格。
- binascii.b2a_qp(data, quotetabs=False, istext=True, header=False)¶
将二进制数据转换为一行或多行 quoted-printable 编码的 ASCII 字符。返回值是转换后的行。如果可选参数 quotetabs 存在且为 true,则所有制表符和空格都将被编码。如果可选参数 istext 存在且为 true,则换行符不会被编码,但行尾的空白字符会被编码。如果可选参数 header 存在且为 true,则空格将根据 RFC 1522 被编码为下划线。如果可选参数 header 存在且为 false,换行符也会被编码;否则换行转换可能会损坏二进制数据流。
- binascii.crc_hqx(data, value)¶
计算 data 的 16 位 CRC 值,以 value 作为初始 CRC,并返回结果。这使用了 CRC-CCITT 多项式 x16 + x12 + x5 + 1,通常表示为 0x1021。此 CRC 用于 binhex4 格式。
- binascii.crc32(data[, value])¶
计算 CRC-32,即 data 的无符号 32 位校验和,以 value 的初始 CRC 开始。默认的初始 CRC 为零。该算法与 ZIP 文件校验和一致。由于该算法被设计用作校验和算法,因此不适合用作通用哈希算法。使用方法如下:
print(binascii.crc32(b"hello world")) # Or, in two pieces: 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)¶
- binascii.unhexlify(hexstr)¶
返回十六进制字符串 hexstr 所表示的二进制数据。此函数是
b2a_hex()
的逆函数。hexstr 必须包含偶数个十六进制数字(可以是大写或小写),否则会引发Error
异常。使用
bytes.fromhex()
类方法也可以访问类似的功能(只接受文本字符串参数,但对空白字符更宽松)。
- exception binascii.Error¶
发生错误时引发的异常。这些通常是编程错误。
- exception binascii.Incomplete¶
在数据不完整时引发的异常。这些通常不是编程错误,但可以通过读取更多数据并重试来处理。