Maison > interface Web > js tutoriel > le corps du texte

Une brève discussion sur la façon d'encoder et de décoder des chaînes en Base64 dans nodejs

青灯夜游
Libérer: 2021-09-08 10:49:18
avant
5542 Les gens l'ont consulté

Qu'est-ce que l'encodage Base64 ? Comment fonctionne Base64 ? L'article suivant vous expliquera comment utiliser Node.js pour encoder et décoder des chaînes en Base64. J'espère qu'il vous sera utile !

Une brève discussion sur la façon d'encoder et de décoder des chaînes en Base64 dans nodejs

Qu'est-ce que l'encodage Base64 ?

L'encodage Base64 est une méthode de conversion de données (généralement binaires) en jeu de caractères ASCII. Base64 est souvent confondu avec une technologie de cryptage en raison de sa capacité à masquer des données. Il convient de souligner que Base64 n'est pas une technologie de cryptage ou de compression. En fait, la taille des informations codées en Base64 est 1,3333 fois la taille réelle des données originales. [Apprentissage recommandé : "Tutoriel Nodejs"]

Compréhension : Supposons que nous ayons 6 caractères ASCII, alors les données binaires sont 6 * 8 = 48 (bits). Si l'encodage Base64 est utilisé, il sera divisé en 48 / 6 = 8 (groupes), et chaque groupe correspondra à un caractère ASCII C'est-à-dire qu'après l'encodage Base64, nous aurons 8 caractères ASCII. Étant donné que les données sont converties en signaux électriques lors de la transmission (bien que ce que vous voyez soient des caractères), la taille des données est calculée en bits. 8 caractères ASCII sont 8 * 8 = 64 (bits), 64/48 = 4/3 ≈ 1,3333. . Pour résumer, la taille des informations codées en Base64 est 1,3333 fois la taille réelle des données originales.

Base64 est la technologie d'encodage de base la plus largement utilisée, les deux autres schémas d'encodage couramment utilisés sont Base16 et Base32.

Comment fonctionne Base64 ?

La conversion des données en base64 est un processus en plusieurs étapes. Voici comment cela fonctionne pour les chaînes de texte :

  1. Calculez la version binaire 8 bits du texte saisi ;
  2. Regroupez la version 8 bits en unités 6 bits ;
  3. Trouvez chaque bloc binaire 6 bits ;
  4. Obtenez le symbole Base64 correspondant à chaque valeur décimale en interrogeant la table d'encodage Base64.

Pour mieux comprendre ce concept, regardons un exemple. Disons que nous avons la chaîne "Go win" et que nous voulons la convertir en chaîne Base64. La première étape consiste à convertir cette chaîne en binaire. La version binaire de "Go win" est :

01000111 01101111 00100000 01110111 01101001 01101110
Copier après la connexion

Vous pouvez voir ici que chaque caractère est représenté par 8 bits. Cependant, comme nous l'avons déjà dit, Base64 convertit les données binaires 8 bits en données 6 bits. En effet, le format Base64 ne comporte que 64 caractères : 26 lettres majuscules, 26 lettres minuscules, 10 caractères numériques et les symboles "+" et "/" pour les sauts de ligne.

Base64 n'utilise pas tous les caractères spéciaux ASCII, mais seulement ces quelques-uns. Notez que certaines implémentations de Base64 utilisent des caractères spéciaux différents de "+" et "/".

Retour à cet exemple, divisons les données de 8 bits en groupes de 6 bits.

010001 110110 111100 100000 011101 110110 100101 101110
Copier après la connexion

Vous ne pourrez pas toujours diviser les données en ensembles complets de 6 bits, auquel cas vous devrez compléter les 0 manuellement.

Maintenant, pour chaque bloc ci-dessus, nous devons trouver sa valeur décimale. Ces valeurs décimales sont données ci-dessous :

Binary Decimal 
010001 17 
110110 54 
111100 60 
100000 32 
011101 29 
110110 54 
100101 37 
101110 46
Copier après la connexion

Enfin, nous devons regarder la valeur Base64 de chaque nombre décimal que nous venons de calculer à partir des données binaires. La table d'encodage Base64 ressemble à ceci :

Une brève discussion sur la façon dencoder et de décoder des chaînes en Base64 dans nodejs

Ici vous pouvez voir que 17 en décimal correspond à "R", 54 en décimal correspond à "2", et ainsi de suite. En utilisant cette table d'encodage, nous pouvons voir que la chaîne "Go win" est codée en Base64 comme "R28gd2lu". Vous pouvez vérifier ce résultat en utilisant n'importe quel convertisseur de texte en Base64 en ligne.

Pourquoi utiliser l'encodage Base64 ?

Envoyer des informations au format binaire peut parfois être risqué, car toutes les applications ou systèmes réseau ne peuvent pas gérer des fichiers binaires bruts. Le jeu de caractères ASCII, en revanche, est bien connu et très simple à gérer pour la plupart des systèmes.

Par exemple, les serveurs de messagerie nécessitent des données texte, c'est pourquoi l'ASCII est souvent utilisé. Ainsi, si vous souhaitez envoyer une image ou tout autre fichier binaire à un serveur de messagerie, vous devez d'abord l'encoder dans un format texte, de préférence ASCII. C'est là que l'encodage Base64 s'avère utile pour convertir les données binaires au format correct.

Encodage en Base64 d'une chaîne à l'aide de Node.js

Le moyen le plus simple d'encoder une chaîne Base64 dans Node.js consiste à utiliser un objet Buffer. Dans Node.js, Buffer est un objet global, ce qui signifie que vous n'avez pas besoin de l'importer dans votre application à l'aide d'une instruction require pour utiliser l'objet Buffer.

在物理内存中,缓冲区是一个不可变的整数数组,它也能够执行许多不同的编码/解码。这些包括到从 UTF-8、UCS2、Base64 和 十六进制编码到另外一种格式, 或者从另外一种格式编码到 UTF-8、UCS2、Base64 和 十六进制。当您编写处理和操作数据的代码时,您可能会在某个时候使用 Buffer 对象。

看看下面的例子。在这里,我们将使用 Buffer 对象将文本字符串编码为 Base64。将以下代码保存在“encode-text.js”文件中:

'use strict'; 

let data = 'stackabuse.com'; 
let buff = new Buffer(data); // 默认用 utf-8 编码格式解释字符串
let base64data = buff.toString('base64');
console.log('"' + data + '" converted to Base64 is "' + base64data + '"');
Copier après la connexion

在上面的脚本中,我们创建了一个新的缓冲区对象并将我们想要转换为 Base64 的字符串传递给它。然后我们在刚刚创建的缓冲区对象上调用“toString”方法,并将“base64”作为参数传递给它。以“base64”为参数的“toString”方法将以 Base64 字符串的形式返回数据。运行上面的代码,你会看到下面的输出。

$ node encode-text.js 
"stackabuse.com" converted to Base64 is "c3RhY2thYnVzZS5jb20="
Copier après la connexion

在输出中,我们可以看到转换为 Base64 的字符串和它的原始数据。

使用 Node.js 解码 Base64 字符串

解码 Base64 字符串与编码非常相似。您必须创建一个新的缓冲区对象并将两个参数传递给它的构造函数。第一个参数是 Base64 中的数据,第二个参数是“base64”。然后您只需在缓冲区对象上调用“toString”,但这次传递给该方法的参数将是“ascii”,因为这是您希望 Base64 数据转换为的数据类型。请查看以下代码片段以供参考。

'use strict'; 
let data = 'Tm8gdG8gUmFjaXNt'; 
let buff = new Buffer(data, 'base64'); 
let text = buff.toString('ascii'); 
console.log('"' + data + '" converted from Base64 to ASCII is "' + text + '"');
Copier après la connexion

将数据添加到 “ascii.js” 文件并保存。这里我们使用了“Tm8gdG8gUmFjaXNt”作为 Base64 输入数据。当这些数据被解码时,它应该显示“No to Racism”。

将二进制数据编码为 Base64 字符串

正如文章开头提到的,Base64 编码的主要目的是将二进制数据转换为文本格式。让我们看一个示例,我们将图像(二进制数据)转换为 Base64 字符串。看看下面的例子。

'use strict'; 

const fs = require('fs'); 
let buff = fs.readFileSync('stack-abuse-logo.png'); 
let base64data = buff.toString('base64'); 
console.log('Image converted to base 64 is:\n\n' + base64data);
Copier après la connexion

在上面的代码中,我们通过 fs 模块的 readFileSync() 方法将图像加载到缓冲区中。该过程的其余部分类似于从普通 ASCII 字符串创建 Base64 字符串。

当您运行上面的代码时,您将看到以下输出。

$ node encode-image.js Image converted to Base64 is: 
iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZmY6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAADuUlEQVQ4EbVUTUtcZxR+7ufkXp1SZ4iZRE1EDVQRnTAhowsZMFm40I2rNqUIIev8hvoPQroQXBTqwiAWcd0EglEhiZNajVZrQGXAWAzaZpzMnZn7lXPeeIe5DaWb9Ax33vOec8/znI/3vVI6nfbxP4v8b/iSJIGfzyGfkPi+D13XUalUBL6qqmIvy5+8WuX/r2RCkUzAoIuLi2hqaoLrutjb28P6+josyxJkiqJA07SQXiqVwHaOZYx/itLc3Px9YIxEIlheXsbExATGxsYwMjIiwEdHRwXA/Pw8EokEcrkcDg4OYJomVlZWMDU1JSqfmZlBR0cHbNsOtVoNCHjlTFiSySQMwxAVxONxQbi0tIRMJoPe3l5MT0+jtbUVg4ODYGImY18qlcL4+DhisZjoggCjv1C7uOyenh7Mzs5iY2ND6FQpdnd3sba2JloSjUYxPDyM/v5+TE5OYn9/X9jZtrOzg+3t7WqyAUmoEu419/+HBw9E+eVymbJqAJP39fWBCR3HEU+hUMDQ0JCYGc8um81iYGAAjY2N8DwvwBdraCY8tHhDA1Y3N9Hd3S2yvH37O7RcbsF7AuUsD9+8wdOFBTx/8QJtbW1C5/nMzc3R0D2UyxXk83lRXcAk1V5GCT5sSUGDbeHxy9/EO98M9OOXzT9wfHISxKC1vR0GHfOtrS2g/SouWwU0Xkggu7qO9PUkJFULnbIQyTm6ewu2hF+vnOIIUQwdGlg8f4QF6wvMWBq+pAkaskSnx4FFVUf0CNpcC797KizXQ4oAHhVdXJJ81F7j6kwUynPHlXDPdFB2fRj+KVK0KvT2rbp3uKYryJU11Cke8qqMuOoioeeJ1MPDYxM36m1cNSq4GdFx58RAWvbx8TrXnK4IgR16Em5GK4iqHi5GHHxLgcSDn97WgZPoND+GGZRpPYH85cgiiRQl1ltXxmFFQ5PuopP8TrW5ZyRcWp7AbmkeZefg5+N6PPnbRJdpw/YlfB0vQiPQZwVdZNtFZEVK6D1VTnccJlXzuqTjvOZiq6Rhj2KqLSJsofOHgIl8+t0/qsfDioxmSUWGjrRFzhYi/5Oynrdl3KXHIZDXtF6hil8R6I9FBV/RvDLnXKxSbAdVYhNeINXBMwmXWCTQGG2Y+Jj+dFrfEmiMAtmeowpo9ojTvkD+A/L1UJUMmiVfkuz6WTyZhFRJAgP33j3bsM5k/Fng68UP21hYJyyxZwLWuS2cKMfUSm3rhD0g4E2g197fwMZ+Bgt8rNe2iP2BhL5dgfFzrx8AfECEDdx45a0AAAAASUVORK5CYII=
Copier après la connexion

虽然实际图像非常小(25x19),但输出仍然相当大,部分原因是 Base64 增加了数据的大小,正如我们之前提到的。

将 Base64 字符串解码为二进制数据

这里的反向过程与我们在前面部分中看到的解码 Base64 字符串的方式非常相似。最大的区别是输出目的地以及数据在那里写入的方式。让我们看看这个例子:

'use strict'; 
const fs = require('fs');

let buff = new Buffer(data, 'base64'); 
fs.writeFileSync('stack-abuse-logo-out.png', buff); 

let data = 'iVBORw0KGgoAAAANSUhEUgAAABkAAAATCAYAAABlcqYFAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAA' + 'CA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAAsTAAALEwEAmpwYAAABWWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0' + 'YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly' + '93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAg' + 'ICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDx0aWZmOk9yaWVudGF0aW9uPjE8L3RpZm' + 'Y6T3JpZW50YXRpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgpMwidZAAADuUlEQVQ4EbVU' + 'TUtcZxR+7ufkXp1SZ4iZRE1EDVQRnTAhowsZMFm40I2rNqUIIev8hvoPQroQXBTqwiAWcd0EglEhiZNajVZrQGXAWAzaZpzMnZn7lXPeeIe5Da' + 'Wb9Ax33vOec8/znI/3vVI6nfbxP4v8b/iSJIGfzyGfkPi+D13XUalUBL6qqmIvy5+8WuX/r2RCkUzAoIuLi2hqaoLrutjb28P6+josyxJkiqJA' + '07SQXiqVwHaOZYx/itLc3Px9YIxEIlheXsbExATGxsYwMjIiwEdHRwXA/Pw8EokEcrkcDg4OYJomVlZWMDU1JSqfmZlBR0cHbNsOtVoNCHjlTF' + 'iSySQMwxAVxONxQbi0tIRMJoPe3l5MT0+jtbUVg4ODYGImY18qlcL4+DhisZjoggCjv1C7uOyenh7Mzs5iY2ND6FQpdnd3sba2JloSjUYxPDyM' + '/v5+TE5OYn9/X9jZtrOzg+3t7WqyAUmoEu419/+HBw9E+eVymbJqAJP39fWBCR3HEU+hUMDQ0JCYGc8um81iYGAAjY2N8DwvwBdraCY8tHhDA1' + 'Y3N9Hd3S2yvH37O7RcbsF7AuUsD9+8wdOFBTx/8QJtbW1C5/nMzc3R0D2UyxXk83lRXcAk1V5GCT5sSUGDbeHxy9/EO98M9OOXzT9wfHISxKC1' + 'vR0GHfOtrS2g/SouWwU0Xkggu7qO9PUkJFULnbIQyTm6ewu2hF+vnOIIUQwdGlg8f4QF6wvMWBq+pAkaskSnx4FFVUf0CNpcC797KizXQ4oAHh' + 'VdXJJ81F7j6kwUynPHlXDPdFB2fRj+KVK0KvT2rbp3uKYryJU11Cke8qqMuOoioeeJ1MPDYxM36m1cNSq4GdFx58RAWvbx8TrXnK4IgR16Em5G' + 'K4iqHi5GHHxLgcSDn97WgZPoND+GGZRpPYH85cgiiRQl1ltXxmFFQ5PuopP8TrW5ZyRcWp7AbmkeZefg5+N6PPnbRJdpw/YlfB0vQiPQZwVdZN' + 'tFZEVK6D1VTnccJlXzuqTjvOZiq6Rhj2KqLSJsofOHgIl8+t0/qsfDioxmSUWGjrRFzhYi/5Oynrdl3KXHIZDXtF6hil8R6I9FBV/RvDLnXKxS' + 'bAdVYhNeINXBMwmXWCTQGG2Y+Jj+dFrfEmiMAtmeowpo9ojTvkD+A/L1UJUMmiVfkuz6WTyZhFRJAgP33j3bsM5k/Fng68UP21hYJyyxZwLWuS' + '2cKMfUSm3rhD0g4E2g197fwMZ+Bgt8rNe2iP2BhL5dgfFzrx8AfECEDdx45a0AAAAASUVORK5CYII=';

console.log('Base64 image data converted to file: stack-abuse-logo-out.png');
Copier après la connexion

在这里您可以看到我们从 Base64 数据(也可以从 socket 或其他一些通信线路接收)开始,然后将其加载到 Buffer 对象中。在创建缓冲区时,我们告诉它它是 base64 格式,这允许缓冲区相应地解析它以进行内部存储。

要将数据保存回原始 PNG 格式,我们只需将 Buffer 对象传递给我们的 fs.writeFileSync 方法,它就会为我们进行转换。

结论

Base64 编码是将二进制数据转换为纯 ASCII 文本的最常用方法之一。它是一种非常有用的格式,用于在一个或多个无法轻松处理二进制数据的系统之间进行通信,例如 HTML 标记中的图像或 Web 请求。

在 Node.js 中,我们可以通过 Buffer 对象来轻松完成 Base64 字符串与许多其他格式数据相互转换的工作。

英文原文地址:https://stackabuse.com/encoding-and-decoding-base64-strings-in-node-js/

更多编程相关知识,请访问:编程视频!!

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:juejin.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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!