binascii — 在二进制和 ASCII 之间转换


binascii 模块包含许多在二进制和各种 ASCII 编码的二进制表示之间进行转换的方法。通常,您不会直接使用这些函数,而是使用包装器模块,如 uubase64binascii 模块包含用 C 语言编写的低级函数,以提高速度,这些函数被更高级别的模块使用。

注意

a2b_* 函数接受仅包含 ASCII 字符的 Unicode 字符串。其他函数只接受 类字节对象(例如 bytesbytearray 和其他支持缓冲区协议的对象)。

版本 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 字母表中的字符。

  • 填充后不包含多余数据(包括多余填充、换行符等)。

  • 不以填充开头。

版本 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 位校验和,从初始 CRC 值 _value_ 开始。默认的初始 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_ 的每个字节都将转换为相应的两位十六进制表示形式。因此,返回的字节对象长度是 _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() 类方法访问。

异常 binascii.Error

发生错误时引发的异常。这些通常是编程错误。

异常 binascii.Incomplete

数据不完整时引发的异常。这些通常不是编程错误,但可以通过读取更多数据并重试来处理。

另请参阅

模块 base64

支持符合 RFC 的 base64 样式编码,基数为 16、32、64 和 85。

模块 uu

支持 Unix 上使用的 UU 编码。

模块 quopri

支持 MIME 电子邮件中使用的可打印字符编码。