首頁  >  文章  >  後端開發  >  使用Python進行Base64編碼和解碼

使用Python進行Base64編碼和解碼

WBOY
WBOY原創
2023-09-02 13:49:051164瀏覽

假設您有一個想要透過網路傳輸的二進位映像檔。您很驚訝對方沒有正確接收該文件 - 該文件只是包含奇怪的字符!

嗯,您似乎試圖以原始位元和位元組格式發送文件,而所使用的媒體是為串流文字而設計的。

避免此類問題的解決方法是什麼?答案是Base64編碼。在本文中,我將向您展示如何使用 Python 對二進位影像進行編碼和解碼。該程式被說明為一個獨立的本地程序,但您可以將該概念應用於不同的應用程序,例如將編碼圖像從行動裝置發送到伺服器以及許多其他應用程式。

什麼是 Base64?

在深入了解本文之前,讓我們先定義一下 Base64 的意思。

Base64 是一種將 8 位元二進位資料編碼為可以用 6 位元表示的格式的方法。僅使用字元A-Za-z0-9 / 用來表示數據,其中= 用來填入資料。例如,使用此編碼,三個 8 位元位元組將轉換為四個 6 位元組。

術語 Base64 取自多用途互聯網郵件擴充 (MIME) 標準,該標準廣泛用於 HTTP 和 XML,最初是為編碼電子郵件附件以進行傳輸而開發的。

我們為什麼要使用 Base64?

Base64 對於二進位資料表示非常重要,因此它允許二進位資料以看起來和充當純文字的方式表示,這使得儲存在資料庫中、在電子郵件中發送或在其他應用程式中使用更加可靠。基於文字的格式,例如 XML。 Base64 主要用於以 ASCII 字串格式表示資料。

如本文介紹中所提到的,如果沒有 Base64,有時資料將根本無法讀取。

Base64 編碼

Base64 編碼是將二進位資料轉換為 64 個字元的有限字元集的過程。如第一節所示,這些字元是A-Za-z0-9 / (數一數,你注意到它們加起來是64 了嗎?)。此字元集被認為是最常見的字元集,被稱為 MIME 的 Base64。它使用A-Za-z0-9 作為前62 個值,以及 / 用於最後兩個值。

Base64編碼的資料最終會比原始資料更長,因此如上所述,每3個位元組的二進位數據,至少有4個位元組的Base64編碼資料。這是因為我們將資料壓縮成更小的字元集。

您是否見過如下所示的原始電子郵件文件的一部分(很可能源自未發送的電子郵件)?如果是這樣,那麼您已經看到了 Base64 編碼的實際應用! (如果你注意到最後有 = ,你可以斷定這是 Base64 編碼,因為編碼過程中使用了等號進行填充。)

Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: base64

2KfZhNiz2YTYp9mFINi52YTZitmD2YUg2YjYsdit2YXYqSDYp9mE2YTZhyDZiNio2LHZg9in2KrZ
h9iMDQoNCtij2YjYryDZgdmC2Lcg2KfZhNin2LPYqtmB2LPYp9ixINi52YYg2KfZhNmF2YLYsdix
2KfYqiDYp9mE2K/Ysdin2LPZitipINin2YTYqtmKINiq2YbYtdit2YjZhiDYqNmH2Kcg2YTZhdmG
INmK2LHZitivINin2YTYqtmI2LPYuSDZgdmKDQrYt9mE2Kgg2KfZhNi52YTZhSDYp9mE2LTYsdi5
2YrYjCDYudmE2YXYpyDYqNij2YbZiiDYutmK2LEg2YXYqtiu2LXYtSDYqNin2YTYudmE2YUg2KfZ
hNi02LHYudmKINmI2KPZgdiq2YLYryDZhNmE2YXZhtmH2Kwg2KfZhNi52YTZhdmKDQrZhNiw2YTZ
gy4NCg0K2KzYstin2YPZhSDYp9mE2YTZhyDYrtmK2LHYpyDYudmE2Ykg2YbYtdit2YPZhSDZgdmK
INmH2LDYpyDYp9mE2LTYo9mGLg0KDQrYudio2K/Yp9mE2LHYrdmF2YYNCg==
--089e0141aa264e929a0514593016
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: base64

Base64分多步驟進行,如下:

  • 要編碼的文字轉換為其各自的十進位值,即轉換為對應的 ASCII 值(即 a:97、b:98 等)。這是 ASCII 表。
  • 將上述步驟中獲得的十進位值轉換為其等價的二進位值(即 97: 01100001)。
  • 將所有二進位等價物連接起來,獲得一大組二進制數。
  • 一大堆二進制數被分成相等的部分,每個部分只包含 6 位元。
  • 相等的 6 位元組將轉換為其十進制等效值。
  • 最後,十進制等值轉換為其 Base64 值(即 4: E)。以下是十進制值及其 Base64 字母表。

Base64解碼

Base64 解碼與 Base64 編碼相反。換句話說,它是透過與上一節中描述的步驟相反的步驟來執行的。

所以Base64解碼的步驟可以描述如下:

  • 字串中的每個字元都會變更為其 Base64 十進位值。
  • 所獲得的十進制值將轉換為其等價的二進位值。
  • 從獲得的每個二進制數中截斷二進制數的前兩位,並將這組 6 位組合在一起,形成一大串二進制數字。
  • 將上一個步驟獲得的大串二進位數字分成 8 位元一組。
  • 8 位元二進制數將轉換為其等值的十進制數。
  • 最後,將獲得的十進位值轉換為對應的 ASCII 值。

字串的Base64編碼和解碼

一旦您了解了幕後發生的事情,您就會更容易理解這一切是如何運作的。讓我們嘗試編碼和解碼一個簡單的三字母單詞,Hey

我們首先將單字的每個字母轉換為其等效的 ASCII,然後將等效的 ASCII 轉換為二進位。這為我們提供了以下值:

ASCII 索引值 8 位二进制值
H 72 01001000
e 101 01100101
y 121 01111001

换句话说,我们可以像这样以二进制形式编写 Hey

01001000 01100101 01111001

总共 24 位,当转换为 6 位组时,每个位产生四个值:

010010 000110 010101 111001

在 Base64 表中,字符 AZ 由值 025 表示。字符 az 由值 2651 表示。数字 09 由值 5261 表示。字符 +/6263 表示。字符 = 用于在无法将位正确分为 6 组时进行填充。

我们现在将重新排列的位转换为数值,然后获取代表这些数值的字符。

6 位二进制值 Base64 索引值
010010 18
000110 6 G
010101 21 V
111001 57 5

根据我们上面的计算,字母 Hey 在 Base64 编码时将变成 SGV5。我们可以使用以下代码测试这是否正确:

from base64 import b64encode

text_binary = b'Hey'

# SGV5
print(b64encode(text_binary))

整个过程反向完成,在Base64解码后得到我们的原始数据。

现在,我将快速向您展示另一个单词 Heyo 的编码,以解释编码字符串中 = 的出现。

ASCII 索引值 8 位二进制值
H 72 01001000
e 101 01100101
y 121 01111001
o 111 01101111

一共有32位。这将为我们提供五个不同的 6 位组,其中有两个剩余位:11。我们用 0000 填充它们以获得 6 位组。根据上述排列将 6 位组成一组将得到以下结果:

010010 000110 010101 111001 011011 110000

重新排列的位将根据 Base64 索引值返回以下字符。

6 位二进制值 Base64 索引值
010010 18
000110 6 G
010101 21 V
111001 57 5
011011 27 b
110000 48 w

这意味着 Heyo 的 Base64 编码值为 SGV5bw==。每个 = 代表一对 00,我们添加它们用于填充原始位序列。

from base64 import b64encode

text_binary = b'Heyo'

# SGV5bw==
print(b64encode(text_binary))

对图像进行 Base64 编码

现在让我们开始讨论本文的重点。在本节中,我将向您展示如何使用 Python 轻松地对图像进行 Base64 编码。

我将使用以下二进制图像。继续下载它,让我们开始使用 Python! (我假设图像的名称是 deer.gif。)

使用Python進行Base64編碼和解碼

为了在Python中使用Base64,我们要做的第一件事就是导入base64模块:

导入base64

为了对图像进行编码,我们只需使用函数 base64.b64encode(s) 即可。 Python对该函数的描述如下:

使用 Base64 对类似字节的对象 s 进行编码并返回编码后的字节。

因此,我们可以执行以下操作来对图像进行 Base64 编码:

import base64 
image = open('deer.gif', 'rb') #open binary file in read mode
image_read = image.read()
image_64_encode = base64.b64encode(image_read)

如果您想查看编码过程的输出,请键入以下内容:

打印 image_64_encode

Base64 解码图像

要使用 Python 解码图像,我们只需使用 base64.b64decode(s) 函数。 Python 提及了有关此函数的以下内容:

解码 Base64 编码的类似字节的对象或 ASCII 字符串并返回解码后的字节。

因此,为了解码我们在上一节中编码的图像,我们执行以下操作:

base64.decode(image_64_encode)

把它们放在一起

让我们将用于 Base64 编码和解码图像的程序放在一起。执行此操作的 Python 脚本应如下所示:

import base64
image = open('deer.gif', 'rb')
image_read = image.read()
image_64_encode = base64.b64encode(image_read)
image_64_decode = base64.b64decode(image_64_encode) 
image_result = open('deer_decode.gif', 'wb') # create a writable image and write the decoding result
image_result.write(image_64_decode)

如果您打开桌面上的 deer_decode.gif,您会发现您拥有我们在第一步中编码的原始图像 deer.gif

正如我们从本文中看到的,Python 使执行看似复杂的任务变得非常容易。

URL 安全编码和解码

正如我在本教程前面提到的,除了常规字母数字值之外,Base64 编码还使用字符 +/ 。但是,这些字符在 URL 中具有特殊含义。这意味着使用这些字符的 Base64 编码值如果在 URL 内部使用,可能会导致意外行为。

此问题的一种解决方案是使用 urlsafe_base64encode()urlsafe_base64decode() 函数对任何数据进行编码和解码。这些函数在编码过程中将 + 替换为 -,将 / 替换为 _

下面是一个 Python 示例,显示了这种差异:

import base64

image = open('dot.jpg', 'rb')
image_data = image.read()

unsafe_encode = base64.b64encode(image_data)
safe_encode = base64.urlsafe_b64encode(image_data)

# b'/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNr....
print(unsafe_encode)

# b'_9j_4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP_sABFEdWNr....
print(safe_encode)

学习Python

无论您是刚刚入门还是希望学习新技能的经验丰富的程序员,都可以通过我们完整的 Python 教程指南学习 Python。

这篇文章已根据 Nitish Kumar 的贡献进行了更新。 Nitish 是一名 Web 开发人员,拥有在各种平台上创建电子商务网站的经验。他将业余时间花在个人项目上,让他的日常生活变得更轻松,或者在晚上与朋友一起散步。

以上是使用Python進行Base64編碼和解碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn