binascii — 二進位制和 ASCII 互轉


binascii 模組包含許多在二進位制和各種 ASCII 編碼的二進位制表示法之間轉換的方法。通常情況下,你不會直接使用這些函式,而是使用包裝模組,如 base64binascii 模組包含了由更高級別的模組所使用的,用 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 字母表中的字元。

  • 填充(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 版本發生變更: 添加了 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 的 base16、base32、base64 和 base85 編碼。

模組 quopri

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