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
異常。如果 validate 為
False
(預設值),那麼在填充檢查之前,既不在標準 base-64 字母表中也不在替代字母表中的字元將被丟棄。如果 validate 為True
,輸入中的這些非字母表字元將導致binascii.Error
。關於嚴格的 base64 檢查的更多資訊,請參見
binascii.a2b_base64()
如果 altchars 的長度不為 2,可能會斷言或引發
ValueError
。
- base64.urlsafe_b64encode(s)¶
使用 URL 和檔案系統安全的字母表對 類位元組物件 s 進行編碼,該字母表在標準 Base64 字母表中用
-
替換+
,用_
替換/
,並返回編碼後的bytes
。結果仍然可能包含=
。
- base64.urlsafe_b64decode(s)¶
使用 URL 和檔案系統安全的字母表解碼 類位元組物件 或 ASCII 字串 s,該字母表在標準 Base64 字母表中用
-
替換+
,用_
替換/
,並返回解碼後的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.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.decode(input, output)¶
解碼二進位制 input 檔案的內容,並將生成的二進位制資料寫入 output 檔案。input 和 output 必須是 檔案物件。將一直讀取 input,直到
input.readline()
返回一個空的位元組物件。
- base64.encode(input, output)¶
編碼二進位制 input 檔案的內容,並將生成的 base64 編碼資料寫入 output 檔案。input 和 output 必須是 檔案物件。將一直讀取 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 節);建議審查任何部署到生產環境的程式碼的安全部分。