Base64 會將任何檔案的原始位元組轉換成可列印的 ASCII 字串,方式是將每三個位元組編碼為從固定 64 字元字母表中取出的四個字元。這個轉換過程完全可逆,因此只要解碼器遵循相同的標準規則,原始位元組序列(包括零、嵌入的 null 位元組,以及二進位簽章)就能在來回轉換後完整保留。Python 開發者在腳本中會使用 base64 模組來執行此轉換,而任何需要在不撰寫程式碼的情況下取得相同標準輸出的人,則可以將本機檔案拖入瀏覽器工具並複製帶有填補字元的字串。由於三個位元組會變成四個字元,編碼後的輸出長度大約會增加三分之一,而且它不會對檔案格式進行任何壓縮、雜湊或解譯。Base64 是編碼而非加密,因此 Base64 字串一旦解碼後,其可讀性與來源檔案完全相同。將編碼後的文字視為任何其他可傳輸的酬載處理——貼到 JSON 欄位、標頭、測試固定資料或資料庫欄位中——就是典型的工作流程,而驗證會在解碼後使用實際的檔案位元組來進行,而不是驗證字母表本身。

how to convert file to base64 in python
how to convert file to base64 in python

Base64 對檔案位元組做了什麼

來源檔案中的每個位元組——值從 0 到 255——會對應到由 64 個字元(A–Z、a–z、0–9、+、/)所組成的標準字母表,加上僅作為填補用途的等號。編碼器每次讀取三個位元組的輸入,並為每組輸出四個字元。當最後一組僅包含一個或兩個位元組時,會以一個或兩個等號來補足四個字元的區塊,因此輸出長度一定是 4 的倍數。編碼器會逐字保留每個位元組;它不會對影像進行轉碼、不會正規化換行字元、不會去除中繼資料,也不會改寫檔案格式。正是這個特性讓 Base64 適合用於透過僅支援文字的通道(例如 JSON 主體、SMTP 主體、XML 屬性或 HTTP 標頭)來傳輸二進位酬載。RFC 4648 定義了字母表、填補規則,以及用以區分合法編碼與寬變體的標準填補位元。

Python 參考做法

在 Python 中,標準函式庫模組 base64 是最常見的做法。腳本以二進位模式開啟檔案,對位元組呼叫 base64.b64encode,然後將產生的 ASCII 文字寫入磁碟或傳送給另一個程序。對應的函式 base64.b64decode 接受該文字並回傳原始位元組,若遇到空白字元、缺少填補或非標準的填補位元,則會引發 binascii.Error。需要串流管線的開發者會在迴圈中對區塊使用 base64.b64encode,或使用 base64.encodebase64 包裝檔案物件來產生可寫入的串流。對於相關的 Python 工作流程,例如將十六進位傾印直接轉為 Base64 而不破壞位元組,From Hex to Base64 in Python Without Breaking the Bytes 這篇指南涵蓋了關於空白字元、大小寫以及部分讀取等容易出錯的細節。當腳本處理的檔案超過數 MB、在受限的工作站上執行,或只是需要快速健全性檢查時,瀏覽器工具便能在不啟動 Python 直譯器的情況下扮演相同角色。

開啟檔案轉 Base64 轉換器

File to Base64 Converter 完全在目前的瀏覽器分頁中處理相同的標準 RFC 4648 編碼與解碼。瀏覽器的 File API 會將所選檔案讀取為 ArrayBuffer,編碼器套用相同的四字元量子規則,最後產生帶有必需等號填補的可列印字串。由於沒有網路上傳步驟,因此不會有任何位元組離開裝置。解碼器在設計上是嚴格的:它僅接受標準字母表,會拒絕空白字元與缺少填補的情況,並會將解碼後的位元組重新編碼,以確認輸入在產生暫時 Blob URL 之前是標準的。可作為實作依據的來源包括:定義字母表與填補規則的 RFC 4648,以及瀏覽器用於本機檔案讀取路的 W3C File API 規格。

使用工具編碼本機檔案

頁面提供兩種明確的模式,當目標是將本機檔案轉成 Base64 文字時,應選擇編碼路徑。

  1. 在目前分頁中開啟 File to Base64 Converter,並確認標題顯示為編碼方向。
  2. 點擊檔案選擇器,從磁碟中選擇任何不超過 10 MB 的檔案;之所以有此限制,是為了限制瀏覽器的記憶體用量,因為來源位元組、編碼後的字串以及呈現的輸出會同時存在。
  3. 等待編碼器透過 File API 讀取位元組,並產生完整的、帶有必需等號填補的標準字串。
  4. 確認頁面上顯示的原始檔名與大小與您選擇的檔案相符,以便確切知道讀取的是哪些位元組。
  5. 複製整個輸出區塊。文字僅包含 Base64 字元與等號,沒有 data URL 前綴、MIME 標頭、換行包裝或檔案名中繼資料;僅在目的地明確需要時再加上這些容器。
  6. 將字串貼到需要它的 JSON 欄位、標頭或測試固定資料中。在儲存之前,請確認目的地預期接收的是帶有標準填補的 Base64。

輸出結果是可逆的。任何取得該字串並將其回傳給嚴格解碼器的人,都能還原出原本讀取的位元組,因此應將編碼後的文字視為與來源檔案同等敏感。

將嚴格 Base64 解碼回檔案

反向操作會將您已有的 Base64 字串,在同一分頁中轉成可下載的檔案。

  1. 將頁面切換到解碼方向,並將標準 Base64 字串貼到輸入區域。
  2. 僅在您了解來源格式時,才移除 data URL 前綴、MIME 標頭、換行包裝或 Base64url 字母表;解碼器僅接受帶有加號與斜線的標準字母表、不含空白字元,且需要等號填補。
  3. 設定能描述已知檔案格式的正確檔名與 MIME 類型。這些欄位不會檢查位元組內容;誤導的副檔名或媒體類型只會讓下一個應用程式感到困惑。
  4. 觸發解碼。頁面會驗證字母表、填補與填補位元,解碼位元組,再重新編碼以排除其他非標準的拼法,最後才顯示暫時的下載連結。
  5. 點擊下載連結,將 Blob URL 儲存到磁碟。該連結僅存在於目前的瀏器工作階段中,當新的轉換將其取代或元件關閉時即會失效。
  6. 在擁有該格式的應用程式中開啟下載的檔案,當完整性很重要時,可將加密雜湊或固定格式簽章與您預期的來源進行比對。

嚴格解碼器強制執行的標準規則

瀏覽器中常存在寬鬆的 Base64 輔助工具,會默默接受空白字元、缺少填補或非標準的填補位元。File to Base64 Converter 內建的嚴格解碼器會拒絕所有非標準的形式,確保下游應用程式永遠不會收到會使自身解析器失敗的檔案。

輸入形式解碼器回應
使用 +/ 的標準字母表,並具備必需的 = 填補接受;重新編碼以確認標準性
任何空白字元、換行符號或歸位字元在產生位元組之前予以拒絕
非空輸入缺少 = 填補以明確錯誤訊息予以拒絕
非零的未使用填補位元(例如一位元組酬載對應的 f==予以拒絕;標記為非標準編碼
使用 -_ 的 Base64url 字母表予以拒絕;請先轉換為標準字母表
在 76 字元處進行的 MIME 換行包裝予以拒絕;貼上前請依 RFC 2045 取消包裝
data: URL 前綴或其他容器予以拒絕;僅在規格要求時移除容器

將輸入嚴格限定為標準形式,代表格式錯誤的字串永遠不會產生部分下載連結,而解碼出來的位元組也永遠會是預期中的位元組。

限制、隱私,以及 Base64 不是什麼

此工具將來源與解碼後的檔案上限設為 10,000,000 位元組。更大的檔案應使用串流命令列或應用程式工作流程,因為瀏覽器分頁會在記憶體中同時保留三份資料。輸出絕不會被靜默截斷;過大的輸入會產生明確的錯誤,且不會產生下載連結。當新的轉換將其取代或元件關閉時,暫時的 Blob URL 會被撤銷,因此正常使用下,過期的記憶體中下載不會堆積。

私取決於分頁周遭的環境。瀏覽器的 File API 會在本機讀取位元組,應用程式不會將檔名、類型或內容傳送至任何伺服器;剪貼簿管理程式、瀏覽器擴充功能、下載檔案處理程式,以及任何您將輸出貼入的目標,都在本機處理範圍之外。請避免在不信任的裝置上處理敏感檔案,因為此轉換並不會保護它們免於受到這些相鄰層級的危害。

Base64 是編碼,不是加密、雜湊、簽章、壓縮、清理或防毒掃描。任何持有該字串的人都能將其解碼,而當編碼後的文字進入記錄檔、支援工單、原始碼或分析管道時,往往會洩漏可辨識的內容。Base64 酬載仍然可能包含惡意程式、私密資料、憑證或可執行位元組。請以與來源檔案相同的慎態度對待它,在解碼後驗證實際格式,並在完整性重要時加入加密雜湊,而非僅依賴字母表。

如需更深入的說明,請參 Base64 Hex Converter: Get Exact RFC 4648 Bytes