Heim >Backend-Entwicklung >Python-Tutorial >Base64-Kodierung und -Dekodierung mit Python
Angenommen, Sie haben eine binäre Bilddatei, die Sie über das Netzwerk übertragen möchten. Sie sind überrascht, dass die andere Partei die Datei nicht korrekt erhalten hat – die Datei enthält nur seltsame Zeichen!
Hmm, es sieht so aus, als würden Sie versuchen, die Datei im Rohbit- und Byteformat zu senden, während das von Ihnen verwendete Medium für das Streamen von Text ausgelegt ist.
Was sind die Lösungen, um solche Probleme zu vermeiden? Die Antwort ist Base64-Kodierung. In diesem Artikel zeige ich Ihnen, wie Sie Binärbilder mit Python kodieren und dekodieren. Das Programm wird als eigenständiges lokales Programm beschrieben, Sie können das Konzept jedoch auf andere Anwendungen anwenden, z. B. auf das Senden codierter Bilder von einem mobilen Gerät an einen Server und viele andere Anwendungen.
Bevor wir uns mit diesem Artikel befassen, definieren wir, was Base64 bedeutet.
Base64 ist eine Methode zum Codieren von 8-Bit-Binärdaten in ein Format, das durch 6 Bit dargestellt werden kann. Zum Auffüllen der Daten werden nur die Zeichen A-Z
、a-z
、0-9
、+
、 /
用来表示数据,其中 =
verwendet. Mit dieser Codierung werden beispielsweise drei 8-Bit-Bytes in vier 6-Bit-Gruppen umgewandelt.
Der Begriff Base64 ist dem Standard Multipurpose Internet Mail Extensions (MIME) entnommen, der in HTTP und XML weit verbreitet ist und ursprünglich für die Kodierung von E-Mail-Anhängen für die Übertragung entwickelt wurde.
Base64 ist für die Darstellung binärer Daten sehr wichtig und ermöglicht daher die Darstellung binärer Daten auf eine Art und Weise, die wie einfacher Text aussieht und sich verhält, was die Speicherung in einer Datenbank, den Versand per E-Mail oder die Verwendung in anderen Anwendungen zuverlässiger macht . Textbasierte Formate wie XML. Base64 wird hauptsächlich zur Darstellung von Daten im ASCII-String-Format verwendet.
Wie in der Einleitung zu diesem Artikel erwähnt, können die Daten ohne Base64 manchmal einfach nicht gelesen werden.
Base64-Codierung ist der Prozess der Konvertierung von Binärdaten in einen begrenzten Satz von 64 Zeichen. Wie im ersten Abschnitt gezeigt, sind diese Zeichen A-Z
、a-z
、0-9
、 +
和 /
(数一数,你注意到它们加起来是 64 了吗?)。该字符集被认为是最常见的字符集,被称为 MIME 的 Base64。它使用 A-Z
、a-z
和 0-9
作为前 62 个值,以及 +
和 /
für die letzten beiden Werte.
Base64-kodierte Daten werden am Ende länger sein als die Originaldaten, so dass, wie oben erwähnt, auf jeweils 3 Bytes Binärdaten mindestens 4 Bytes Base64-kodierte Daten kommen. Dies liegt daran, dass wir die Daten in einen kleineren Zeichensatz komprimieren.
Haben Sie jemals einen Teil einer Original-E-Mail-Datei wie den folgenden gesehen (höchstwahrscheinlich stammt er aus einer nicht gesendeten E-Mail)? Wenn ja, dann haben Sie die Base64-Codierung in Aktion gesehen! (Wenn Sie das =
am Ende bemerken, können Sie erkennen, dass es sich um eine Base64-Kodierung handelt, da das Gleichheitszeichen zum Auffüllen während der Kodierung verwendet wird.)
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 wird in mehreren Schritten wie folgt ausgeführt:
Base64-Dekodierung ist das Gegenteil der Base64-Kodierung. Mit anderen Worten: Es erfolgt durch Umkehrung der im vorherigen Abschnitt beschriebenen Schritte.
Die Schritte der Base64-Dekodierung können also wie folgt beschrieben werden:
Sobald Sie verstehen, was sich hinter den Kulissen abspielt, wird es einfacher zu verstehen, wie alles funktioniert. Versuchen wir, ein einfaches Wort aus drei Buchstaben zu kodieren und zu dekodieren, Hey
.
Wir wandeln zunächst jeden Buchstaben des Wortes in sein ASCII-Äquivalent um und wandeln dann das ASCII-Äquivalent in eine Binärdatei um. Daraus ergeben sich folgende Werte:
信 | ASCII 索引值 | 8 位二进制值 |
---|---|---|
H | 72 | 01001000 |
e | 101 | 01100101 |
y | 121 | 01111001 |
换句话说,我们可以像这样以二进制形式编写 Hey
:
01001000 01100101 01111001
总共 24 位,当转换为 6 位组时,每个位产生四个值:
010010 000110 010101 111001
在 Base64 表中,字符 A
到 Z
由值 0 到 25 表示。字符 a
到 z
由值 26 到 51 表示。数字 0
到 9
由值 52 到 61 表示。字符 +
和 /
用 62 和 63 表示。字符 =
用于在无法将位正确分为 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))
现在让我们开始讨论本文的重点。在本节中,我将向您展示如何使用 Python 轻松地对图像进行 Base64 编码。
我将使用以下二进制图像。继续下载它,让我们开始使用 Python! (我假设图像的名称是 deer.gif。)
为了在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
要使用 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 使执行看似复杂的任务变得非常容易。
正如我在本教程前面提到的,除了常规字母数字值之外,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。
这篇文章已根据 Nitish Kumar 的贡献进行了更新。 Nitish 是一名 Web 开发人员,拥有在各种平台上创建电子商务网站的经验。他将业余时间花在个人项目上,让他的日常生活变得更轻松,或者在晚上与朋友一起散步。
Das obige ist der detaillierte Inhalt vonBase64-Kodierung und -Dekodierung mit Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!