base64 — Base16、Base32、Base64、Base85 資料編碼

原始碼: Lib/base64.py


此模組提供了將二進位制資料編碼為可列印 ASCII 字元以及將這些編碼解碼回二進位制資料的函式。這包括 RFC 4648 中指定的編碼(Base64、Base32 和 Base16)以及非標準的 Base85 編碼

此模組提供了兩種介面。現代介面支援將 類位元組物件 編碼為 ASCII bytes,並將 類位元組物件 或包含 ASCII 的字串解碼為 bytes。支援 RFC 4648 中定義的兩種 base-64 字母表(標準字母表,以及 URL 和檔案系統安全字母表)。

傳統介面 不支援從字串解碼,但它提供了用於對 檔案物件 進行編碼和解碼的函式。它只支援 Base64 標準字母表,並根據 RFC 2045 的規定每 76 個字元新增一個換行符。請注意,如果你正在尋找 RFC 2045 支援,你可能應該檢視 email 包。

在 3.3 版更改: 現代介面的解碼函式現在接受僅含 ASCII 的 Unicode 字串。

在 3.4 版更改: 此模組中的所有編碼和解碼函式現在都接受任何 類位元組物件。添加了對 Ascii85/Base85 的支援。

RFC 4648 編碼

RFC 4648 編碼適用於對二進位制資料進行編碼,以便可以透過電子郵件安全傳送、用作 URL 的一部分,或作為 HTTP POST 請求的一部分包含在內。

base64.b64encode(s, altchars=None)

使用 Base64 對 類位元組物件 s 進行編碼,並返回編碼後的 bytes

可選的 altchars 必須是長度為 2 的 類位元組物件,用於指定 +/ 字元的替代字母表。這允許應用程式生成例如 URL 或檔案系統安全的 Base64 字串。預設值為 None,此時使用標準的 Base64 字母表。

如果 altchars 的長度不為 2,可能會斷言或引發 ValueError。如果 altchars 不是 類位元組物件,則引發 TypeError

base64.b64decode(s, altchars=None, validate=False)

解碼 Base64 編碼的 類位元組物件 或 ASCII 字串 s,並返回解碼後的 bytes

可選的 altchars 必須是長度為 2 的 類位元組物件 或 ASCII 字串,用於指定替代 +/ 字元的替代字母表。

如果 s 的填充不正確,則會引發 binascii.Error 異常。

如果 validateFalse (預設值),那麼在填充檢查之前,既不在標準 base-64 字母表中也不在替代字母表中的字元將被丟棄。如果 validateTrue,輸入中的這些非字母表字元將導致 binascii.Error

關於嚴格的 base64 檢查的更多資訊,請參見 binascii.a2b_base64()

如果 altchars 的長度不為 2,可能會斷言或引發 ValueError

base64.standard_b64encode(s)

使用標準 Base64 字母表對 類位元組物件 s 進行編碼,並返回編碼後的 bytes

base64.standard_b64decode(s)

使用標準 Base64 字母表解碼 類位元組物件 或 ASCII 字串 s,並返回解碼後的 bytes

base64.urlsafe_b64encode(s)

使用 URL 和檔案系統安全的字母表對 類位元組物件 s 進行編碼,該字母表在標準 Base64 字母表中用 - 替換 +,用 _ 替換 /,並返回編碼後的 bytes。結果仍然可能包含 =

base64.urlsafe_b64decode(s)

使用 URL 和檔案系統安全的字母表解碼 類位元組物件 或 ASCII 字串 s,該字母表在標準 Base64 字母表中用 - 替換 +,用 _ 替換 /,並返回解碼後的 bytes

base64.b32encode(s)

使用 Base32 對 類位元組物件 s 進行編碼,並返回編碼後的 bytes

base64.b32decode(s, casefold=False, map01=None)

解碼 Base32 編碼的 類位元組物件 或 ASCII 字串 s,並返回解碼後的 bytes

可選的 casefold 是一個標誌,指定是否接受小寫字母表作為輸入。出於安全考慮,預設值為 False

RFC 4648 允許將數字 0(零)可選地對映到字母 O(oh),並將數字 1(一)可選地對映到字母 I(eye)或字母 L(el)。可選引數 map01 在不為 None 時,指定數字 1 應該對映到哪個字母(當 map01 不為 None 時,數字 0 總是對映到字母 O)。出於安全考慮,預設值為 None,因此輸入中不允許出現 0 和 1。

如果 s 的填充不正確或輸入中存在非字母表字元,則會引發 binascii.Error

base64.b32hexencode(s)

類似於 b32encode(),但使用 RFC 4648 中定義的擴充套件十六進位制字母表。

在 3.10 版本加入。

base64.b32hexdecode(s, casefold=False)

類似於 b32decode(),但使用 RFC 4648 中定義的擴充套件十六進位制字母表。

此版本不允許將數字 0(零)對映到字母 O(oh),也不允許將數字 1(一)對映到字母 I(eye)或字母 L(el),所有這些字元都包含在擴充套件十六進位制字母表中,並且不可互換。

在 3.10 版本加入。

base64.b16encode(s)

使用 Base16 對 類位元組物件 s 進行編碼,並返回編碼後的 bytes

base64.b16decode(s, casefold=False)

解碼 Base16 編碼的 類位元組物件 或 ASCII 字串 s,並返回解碼後的 bytes

可選的 casefold 是一個標誌,指定是否接受小寫字母表作為輸入。出於安全考慮,預設值為 False

如果 s 的填充不正確或輸入中存在非字母表字元,則會引發 binascii.Error

Base85 編碼

Base85 編碼沒有正式規定,而是一種事實上的標準,因此不同的系統執行編碼的方式不同。

此模組中的 a85encode()b85encode() 函式是這個事實標準的兩種實現。你應該呼叫與你打算使用的軟體所使用的 Base85 實現相匹配的函式。

此模組中提供的兩個函式在處理以下方面有所不同

  • 是否包含 <~~> 標記

  • 是否包含換行符

  • 用於編碼的 ASCII 字元集

  • 處理空位元組

有關更多資訊,請參考各個函式的文件。

base64.a85encode(b, *, foldspaces=False, wrapcol=0, pad=False, adobe=False)

使用 Ascii85 對 類位元組物件 b 進行編碼,並返回編碼後的 bytes

foldspaces 是一個可選標誌,它使用特殊的短序列 'y' 來代替 4 個連續的空格 (ASCII 0x20),這是 'btoa' 所支援的。這個特性不被“標準”Ascii85 編碼所支援。

wrapcol 控制輸出是否應新增換行符 (b'\n')。如果該值非零,則每個輸出行的長度最多為此字元數,不包括末尾的換行符。

pad 控制在編碼前是否將輸入填充到 4 的倍數。請注意,btoa 實現總是進行填充。

adobe 控制編碼後的位元組序列是否用 <~~> 括起來,這是 Adobe 實現所使用的。

在 3.4 版本加入。

base64.a85decode(b, *, foldspaces=False, adobe=False, ignorechars=b' \t\n\r\x0b')

解碼 Ascii85 編碼的 類位元組物件 或 ASCII 字串 b,並返回解碼後的 bytes

foldspaces 是一個標誌,指定是否應接受 'y' 短序列作為 4 個連續空格 (ASCII 0x20) 的簡寫。這個特性不被“標準”Ascii85 編碼所支援。

adobe 控制輸入序列是否為 Adobe Ascii85 格式(即用 <~ 和 ~> 括起來)。

ignorechars 應該是一個 類位元組物件 或 ASCII 字串,包含要從輸入中忽略的字元。它應該只包含空白字元,預設情況下包含 ASCII 中的所有空白字元。

在 3.4 版本加入。

base64.b85encode(b, pad=False)

使用 base85(例如在 git 風格的二進位制差異中使用的)對 類位元組物件 b 進行編碼,並返回編碼後的 bytes

如果 pad 為 true,則在編碼前用 b'\0' 填充輸入,使其長度是 4 位元組的倍數。

在 3.4 版本加入。

base64.b85decode(b)

解碼 base85 編碼的 類位元組物件 或 ASCII 字串 b,並返回解碼後的 bytes。如有必要,填充會被隱式移除。

在 3.4 版本加入。

base64.z85encode(s)

使用 Z85(如 ZeroMQ 中使用的)對 類位元組物件 s 進行編碼,並返回編碼後的 bytes。更多資訊請參見 Z85 規範

在 3.13 版本加入。

base64.z85decode(s)

解碼 Z85 編碼的 類位元組物件 或 ASCII 字串 s,並返回解碼後的 bytes。更多資訊請參見 Z85 規範

在 3.13 版本加入。

傳統介面

base64.decode(input, output)

解碼二進位制 input 檔案的內容,並將生成的二進位制資料寫入 output 檔案。inputoutput 必須是 檔案物件。將一直讀取 input,直到 input.readline() 返回一個空的位元組物件。

base64.decodebytes(s)

解碼 類位元組物件 s,該物件必須包含一行或多行 base64 編碼的資料,並返回解碼後的 bytes

在 3.1 版本加入。

base64.encode(input, output)

編碼二進位制 input 檔案的內容,並將生成的 base64 編碼資料寫入 output 檔案。inputoutput 必須是 檔案物件。將一直讀取 input,直到 input.read() 返回一個空的位元組物件。根據 RFC 2045 (MIME) 的規定,encode() 在輸出的每 76 個位元組後插入一個換行符 (b'\n'),並確保輸出始終以換行符結尾。

base64.encodebytes(s)

編碼 類位元組物件 s,它可以包含任意二進位制資料,並返回包含 base64 編碼資料的 bytes,根據 RFC 2045 (MIME) 的規定,在輸出的每 76 個位元組後插入換行符 (b'\n'),並確保有一個尾隨換行符。

在 3.1 版本加入。

模組用法示例

>>> import base64
>>> encoded = base64.b64encode(b'data to be encoded')
>>> encoded
b'ZGF0YSB0byBiZSBlbmNvZGVk'
>>> data = base64.b64decode(encoded)
>>> data
b'data to be encoded'

安全考慮

RFC 4648 中增加了一個新的安全考慮章節(第 12 節);建議審查任何部署到生產環境的程式碼的安全部分。

參見

模組 binascii

包含 ASCII 到二進位制和二進位制到 ASCII 轉換的支援模組。

RFC 1521 - MIME(多用途網際網路郵件擴充套件)第一部分:指定和描述網際網路郵件正文格式的機制

第 5.2 節,“Base64 內容傳輸編碼”,提供了 base64 編碼的定義。