binascii — 二進位制和 ASCII 之間的轉換


binascii 模組包含許多在二進位制和各種 ASCII 編碼的二進位制表示之間進行轉換的方法。通常,您不會直接使用這些函式,而是使用像 base64 這樣的包裝模組。 binascii 模組包含用 C 編寫的底層函式,用於提高速度,供更高級別的模組使用。

注意

a2b_* 函式接受僅包含 ASCII 字元的 Unicode 字串。其他函式僅接受類位元組物件(例如 bytesbytearray 和其他支援緩衝區協議的物件)。

在 3.3 版本中更改: a2b_* 函式現在接受僅包含 ASCII 的 unicode 字串。

binascii 模組定義了以下函式

binascii.a2b_uu(string)

將單行 uuencoded 資料轉換回二進位制並返回二進位制資料。行通常包含 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 位校驗和,從 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 版本中更改: 添加了 sepbytes_per_sep 引數。

binascii.a2b_hex(hexstr)
binascii.unhexlify(hexstr)

返回由十六進位制字串 hexstr 表示的二進位制資料。此函式是 b2a_hex() 的逆運算。hexstr 必須包含偶數個十六進位制數字(可以是大小寫),否則將引發 Error 異常。

使用 bytes.fromhex() 類方法也可以訪問類似的功能(只接受文字字串引數,但對空格更寬鬆)。

exception binascii.Error

發生錯誤時引發的異常。 這些通常是程式設計錯誤。

exception binascii.Incomplete

資料不完整時引發的異常。 這些通常不是程式設計錯誤,但可以透過讀取更多資料並重試來處理。

另請參閱

模組 base64

支援 RFC 相容的 base64 樣式編碼,包括 base 16、32、64 和 85。

模組 quopri

支援 MIME 電子郵件訊息中使用的 quoted-printable 編碼。