Base64

Base64 是一組相似的二進位制到文字編碼方案,透過將二進位制資料轉換為基數 64 表示,將其表示為 ASCII 字串格式。術語 Base64 源於特定的 MIME 內容傳輸編碼

Base64 編碼方案通常用於對二進位制資料進行編碼,以便在只能處理 ASCII 文字(或某種不能接受任意二進位制資料的 ASCII 超集)的介質上儲存或傳輸。這確保了資料在傳輸過程中保持完整無修改。Base64 的常見應用包括:

  • 透過 MIME 傳送電子郵件
  • XML 中儲存複雜資料
  • 對二進位制資料進行編碼,以便將其包含在 data: URL

Base64 字元

當單獨使用“Base64”一詞指代特定演算法時,通常指 RFC 4648 第 4 節中概述的 Base64 版本,該版本使用以下字母表表示基數 64 位,並使用 = 作為填充字元:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

URL 和檔名安全的 Base64

此定義的一個常見變體僅允許在檔名和 URL 值中安全使用的字元。這個版本在 RFC 4648 第 5 節中定義,省略了填充,並將 +/ 替換為 -_

如果您不將資料放入路徑段或查詢引數中,則不需要此編碼——例如,資料 URL 沒有這兩者,可以使用標準 Base64 編碼。

編碼後大小增加

每個 Base64 數字代表 6 位資料(64 = 26)。因此,輸入字串/二進位制檔案的三個 8 位位元組(3×8 位 = 24 位)可以用四個 6 位 Base64 數字(4×6 = 24 位)表示。

這意味著字串或檔案的 Base64 版本通常比其原始檔大大約三分之一(確切的大小增加取決於各種因素,例如字串的絕對長度、其長度除以 3 的餘數以及是否使用填充字元)。

最後一個塊

Base64 字串可以分成 4 個字元的塊,最後一個塊的字元數可能少於 4 個。最後一個塊可以用 = 字元填充,使其恰好為 4 個字元長。排除填充字元,最後一個塊可以是以下之一:

  • 2 個字元:編碼 12 位,表示 1 位元組(8 位)資料
  • 3 個字元:編碼 18 位,表示 2 位元組(16 位)資料
  • 4 個字元:編碼 24 位,表示 3 位元組(24 位)資料

在前兩種情況下,字元可能包含 4 或 2 個額外的尾隨位,這些位不表示任何資料。在這種情況下,RFC 4648 要求編碼器將這些位設定為零,解碼器如果這些位不為零則可選地丟擲錯誤。例如,如果編碼資料是一個位元組 0b01010101,那麼它需要兩個字元 0b010101 (V) 和 0b010000 (Q),其中第二個字元有 4 個尾隨位設定為零。解碼 VR==(其中第二個字元表示 0b010001)在技術上會得到相同的位元組 0b01010101,但解碼器可能會因為尾隨位不為零而丟擲錯誤。

JavaScript 支援

Uint8Array 類提供了 Uint8Array.fromBase64()Uint8Array.prototype.toBase64()Uint8Array.prototype.setFromBase64() 方法,用於 Base64 字串的相互轉換。

瀏覽器還原生提供了兩個 JavaScript 函式用於解碼和編碼 Base64 字串:

注意:Base64 是一種二進位制編碼,而不是文字編碼,但 btoaatob 在網路平臺支援二進位制資料型別之前就被新增。因此,這兩個函式使用字串來表示二進位制資料,每個字元的碼點代表每個位元組的值。這導致了一個常見的誤解,即 btoa 可以用於編碼任意文字資料——例如,建立一個文字或 HTML 文件的 Base64 data: URL。

然而,位元組到碼點的對應關係僅對碼點小於等於 0x7f 的情況可靠。此外,碼點超過 0xff 會導致 btoa 丟擲錯誤,因為超出了 1 位元組的最大值。下一節詳細介紹了在編碼任意 Unicode 文字時如何解決此限制。

參見