在 Python 中解碼 Base-64 資料

Jay Shaw 2023年1月30日 2022年5月17日
  1. 在 Python 中演示解碼 Base64 資料
  2. 在 Python 中使用 Base64 解碼影象
在 Python 中解碼 Base-64 資料

本文旨在解釋如何解碼 Base64。我們將檢視解碼 Base64 資料的程式碼,然後嘗試 Base64 影象解碼。

在 Python 中演示解碼 Base64 資料

Base64 解碼是一個五步過程,如下。

  • 取 base64 格式的字串,轉換成對應的十進位制形式,按照 base64 解碼轉換表。
  • 將這些十進位制數轉換為 6 位二進位制。
  • 轉換後,這些 6 位二進位制需要分離成 8 位二進位制表示格式。
  • 這些 8 位二進位制數需要再次轉換為十進位制形式。
  • 最後,這些十進位制數字需要轉換為相應的 base64 編碼字母。

參考下面的例子。

假設我們有一個 Base64 編碼的字串 U3Vubnk=,它必須經過 Base64 解碼。第一步需要將其轉換為十進位制形式。

20 55 21 46 27 39 36=

這些十進位制字元需要轉換為它們的 6 位二進位制形式。

010100, 110111, 010101, 101110, 011011, 100111, 100100, 00

將其分離為 8 位:

01010011, 01110101, 01101110, 01101110, 01111001, 00000000

最後一組附加了 4 個額外的零以使其成為 8 位。它不影響結果。現在,這些 8 位二進位制文​​件需要轉換為十進位制格式。

83 117 110 110 121 0

最後,我們將使用標準轉換表將這些十進位制數字轉換為相應的字母。

S u n n y

在 Python 中手動解碼 Base64 資料

這些是在 Python 中手動解碼 Base64 的步驟。

  • 匯入 Base64 庫包。這個庫包有助於在 Python 中編碼和解碼 Base64 數字。
  • 宣告一個字串變數 input_string 並將編碼值’U3Vubnk=‘作為輸入。
  • 變數 base64_converted_string 採用值 ‘U3Vubnk=’ 並將其轉換為 ASCII 值。
  • 在第四步中,我們使用變數 decode 將 ASCII 值轉換為它們的 Base64 值。下面的語法將 ASCII 值轉換為它們的 Base64 值。

    ``text
    base64.b64decode(base64_converted_string)

  • 最後一步,變數 decimal_converted_string 用於將 Base64 值解碼為相應的 ASCII 字元。

    語法:

    variable_name.decode("ascii")
    

在下面的程式中,decode 是儲存 Base64 解碼值的變數。我們需要列印變數 decimal_converted_string 來檢視解碼結果。

程式碼:

import base64

input_string = "U3Vubnk="
base64_converted_string = input_string.encode("ascii")
decode = base64.b64decode(base64_converted_string)
decimal_converted_string = decode.decode("ascii")

print(decimal_converted_string)

輸出:

Sunny

在 Python 中使用 UTF-8 解碼 Base64 資料

UTF-8 方法是使用 python 解碼 Base64 的更直接的方法。讓我們看看這是如何工作的。

  • 我們首先需要像上面的程式一樣匯入 Base64 庫包。
  • 變數 input_string 用於儲存需要解碼的值。
  • 我們使用變數 decoded_value 將輸入字串轉換為其對應的二進位制陣列值。用於解釋此字串的方法是 UTF-8,它與 ASCII 非常相似。
  • 字串被解釋為它的 8 位二進位制值。也可以選擇其他解釋格式。
  • 為了檢視結果,我們列印變數 decoded_value

程式碼:

import base64

input_string = 'U3Vubnk='

decoded_value = base64.b64decode(input_string).decode('utf-8')

print(decoded_value)

輸出:

Sunny

在 Python 中使用 Base64 解碼影象

最後一節將討論 Base64 解碼的實際用途,例如 Base64 影象編碼和解碼。我們將研究如何使用 Python 將影象編碼到其 Base64 程式碼中,以及如何將其解碼回來。

我們有一個名為 cheers.jpg 的影象,它將被編碼。

使用 Base64 編碼的影象

在 Python 中使用 Base64 對影象進行編碼

匯入 Base64 庫包。語法 with open("cheers.jpg", "rb") 是一個 Base64 函式,它將影象的位元組儲存在我們建立的名為 photo2code 的物件中。

影象的 Base64 編碼值儲存在變數 coded_str 中。語法 photo2code.read() 讀取影象的位元組值,函式 base64.b64encode(objectname.read() 將位元組值轉換為 Base64 編碼值。

最後,列印 coded_str 以檢視 Base64 輸出。

程式碼:

import base64

with open("cheers.jpg", "rb") as photo2code:
    coded_str = base64.b64encode(photo2code.read())
    print(coded_str)

在這裡,輸出是一個長密文。你可以執行上述程式碼以在你的機器上生成結果。

在 Python 中將 Base64 程式碼解碼為其影象形式

解碼影象檔案需要兩個主要步驟:

  • 讀取 Base64 資料,以及
  • 解碼資料並將其寫入影象檔案。

讀取 Base64 資料

建立一個可寫的 .bin 檔案來儲存此步驟的 Base64 值。

語法 with open('file_name, "wb") as file: 建立一個可寫的 ("wb") .bin 檔案,我們在其中儲存 Base64 值。file.write(coded_str) 語法只是將這些 Base64 值寫入該 .bin 檔案。

這裡,變數 coded_str 用於上述程式。上述程式可用於重新建立 coded_str 變數,但也可以使用 .txt 檔案。

它所需要的只是將具有 Base64 值的檔案放入語法中,with open('(filename.extension)', "wb") as file:,然後該檔案將被載入到程式中。應確保該檔案與儲存 python.txt 檔案的目錄相同,否則系統不會與之互動。

解碼 Base64 值並寫入影象檔案

在這裡,我們將使用 .bin 檔案中的值進行解碼。建立變數 decoder,通過語法 decoder = open('pic_encoding.bin', 'rb') 載入 .bin 檔案。

該檔案作為可讀實體載入,因為我們將不再在該檔案中寫入任何內容。然後使用語法 read_b64 = decoder.read() 的變數讀取解碼器的內容。

變數 final_decoder 用於建立一個新的可寫 .jpeg 檔案,我們將在其中儲存解碼後的 Base64 值。

最後,我們將內容解碼並寫入一個新的影象檔案。

讓我們回顧一下到目前為止為使一切變得清晰的步驟。

  • 我們在 coded_str 變數中有 Base64 值。
  • 這些值寫入 .bin 檔案 pic_encoding.bin
  • 然後,資料從 .bin 檔案載入到變數 decode。
  • 我們使用變數 read_64 來讀取儲存在解碼器變數中的編碼值。
  • 最後,我們建立一個空影象檔案 pic_decoded_back.jpeg 和變數 final_decoder,它將充當將解碼資料傳輸到影象檔案中的漏斗。

當上述所有步驟啟動時,我們解碼二進位制值並使用語法將這些值寫入影象檔案,

final_decoder.write(base64.b64decode((read_b64)))

Base64 函式從變數 read_b64 中獲取值,並通過變數 final_decoder 將它們傳輸到影象檔案中。

如果執行得當,該程式將在 python.txt 檔案所在的同一目錄中生成一個新的影象檔案。

程式碼:

import base64

with open('pic_encoding.bin', "wb") as file:
    file.write(coded_str)

## decoding
decoder = open('pic_encoding.bin', 'rb')
read_b64 = decoder.read()

final_decoder = open('pic_decoded_back.jpeg', 'wb')
final_decoder.write(base64.b64decode((read_b64)))