Maison > développement back-end > Tutoriel Python > Encodage et décodage Base64 à l'aide de Python

Encodage et décodage Base64 à l'aide de Python

WBOY
Libérer: 2023-09-02 13:49:05
original
1224 Les gens l'ont consulté

Supposons que vous ayez un fichier image binaire que vous souhaitez transférer sur le réseau. Vous êtes surpris que l'autre partie n'ait pas reçu le fichier correctement : le fichier contient simplement des caractères étranges !

Hmm, il semble que vous essayez d'envoyer le fichier au format bits et octets bruts, alors que le support que vous utilisez est conçu pour diffuser du texte.

Quelles sont les solutions pour éviter de tels problèmes ? La réponse est le codage Base64. Dans cet article, je vais vous montrer comment encoder et décoder des images binaires à l'aide de Python. Le programme est expliqué comme un programme local autonome, mais vous pouvez appliquer le concept à différentes applications, telles que l'envoi d'images codées depuis un appareil mobile vers un serveur et de nombreuses autres applications.

Qu'est-ce que Base64 ?

Avant de plonger dans cet article, définissons ce que signifie Base64.

Base64 est une méthode de codage de données binaires 8 bits dans un format pouvant être représenté par 6 bits. Seuls les caractères A-Za-z0-9+/ 用来表示数据,其中 = sont utilisés pour renseigner les données. Par exemple, en utilisant ce codage, trois octets de 8 bits sont convertis en quatre groupes de 6 bits.

Le terme Base64 est tiré de la norme MIME (MultiPurpose Internet Mail Extensions), largement utilisée en HTTP et XML et qui a été développée à l'origine pour coder les pièces jointes aux e-mails à transmettre.

Pourquoi utilisons-nous Base64 ?

Base64 est très important pour la représentation des données binaires, il permet donc de représenter les données binaires d'une manière qui ressemble et agit comme du texte brut, ce qui les rend plus fiables à stocker dans une base de données, à envoyer dans un e-mail ou à utiliser dans d'autres applications. . Formats basés sur du texte tels que XML. Base64 est principalement utilisé pour représenter des données au format de chaîne ASCII.

Comme mentionné dans l'introduction de cet article, sans Base64, parfois les données ne peuvent tout simplement pas être lues.

Encodage Base64

L'encodage Base64 est le processus de conversion de données binaires en un ensemble limité de 64 caractères. Comme indiqué dans la première section, ces caractères sont A-Za-z0-9 +/ (数一数,你注意到它们加起来是 64 了吗?)。该字符集被认为是最常见的字符集,被称为 MIME 的 Base64。它使用 A-Za-z0-9 作为前 62 个值,以及 + / pour les deux dernières valeurs.

Les données codées en Base64 finiront par être plus longues que les données d'origine, donc comme mentionné ci-dessus, pour chaque 3 octets de données binaires, il y a au moins 4 octets de données codées en Base64. En effet, nous compressons les données dans un jeu de caractères plus petit.

Avez-vous déjà vu une partie d'un fichier d'e-mail original comme celui ci-dessous (très probablement dérivé d'un e-mail non envoyé) ? Si tel est le cas, alors vous avez vu l’encodage Base64 en action ! (Si vous remarquez le = à la fin, vous pouvez dire qu'il s'agit d'un encodage Base64 car le signe égal est utilisé pour le remplissage lors de l'encodage.)

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
Copier après la connexion

Base64 s'effectue en plusieurs étapes, comme suit :

  • Le texte à encoder est converti en sa valeur décimale respective, c'est-à-dire en la valeur ASCII correspondante (c'est-à-dire a:97, b:98, etc.). Il s'agit du tableau ASCII.
  • Convertissez la valeur décimale obtenue à l'étape ci-dessus en sa valeur binaire équivalente (c'est-à-dire 97 : 01100001).
  • Concaténez tous les équivalents binaires pour obtenir un grand ensemble de nombres binaires.
  • Un tas de nombres binaires divisés en parties égales, chaque partie ne contenant que 6 bits.
  • Les groupes égaux de 6 bits seront convertis en leurs équivalents décimaux.
  • Enfin, l'équivalent décimal est converti en sa valeur Base64 (soit 4 : E). Vous trouverez ci-dessous les valeurs décimales et leur alphabet Base64.

Décodage Base64

Le décodage Base64 est l’opposé du codage Base64. En d’autres termes, elle s’effectue en inversant les étapes décrites dans la section précédente.

Les étapes du décodage Base64 peuvent donc être décrites comme suit :

  • Chaque caractère de la chaîne est remplacé par sa valeur décimale Base64.
  • La valeur décimale obtenue sera convertie en sa valeur binaire équivalente.
  • Tronquez les deux premiers chiffres du nombre binaire de chaque nombre binaire obtenu et combinez l'ensemble de 6 bits ensemble pour former une grande chaîne de chiffres binaires.
  • Divisez la grande chaîne de nombres binaires obtenue à l'étape précédente en groupes de 8 chiffres.
  • Les nombres binaires de 8 bits seront convertis en leurs équivalents décimaux.
  • Enfin, convertissez la valeur décimale obtenue en valeur ASCII correspondante.

Encodage et décodage Base64 des chaînes

Une fois que vous aurez compris ce qui se passe dans les coulisses, il sera plus facile de comprendre comment tout cela fonctionne. Essayons d'encoder et de décoder un simple mot de trois lettres, Hey.

Nous convertissons d'abord chaque lettre du mot en son équivalent ASCII, puis convertissons l'équivalent ASCII en binaire. Cela nous donne les valeurs suivantes :

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

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

01001000 01100101 01111001
Copier après la connexion

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

010010 000110 010101 111001
Copier après la connexion

在 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))
Copier après la connexion

整个过程反向完成,在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
Copier après la connexion

重新排列的位将根据 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))
Copier après la connexion

对图像进行 Base64 编码

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

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

Encodage et décodage Base64 à laide de Python

为了在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)
Copier après la connexion

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

打印 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)
Copier après la connexion

如果您打开桌面上的 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)
Copier après la connexion

学习Python

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal