Heim > Web-Frontend > js-Tutorial > Hauptteil

Eine kurze Diskussion darüber, wie Strings in NodeJS mit Base64 kodiert und dekodiert werden

青灯夜游
Freigeben: 2021-09-08 10:49:18
nach vorne
5542 Leute haben es durchsucht

Was ist Base64-Kodierung? Wie funktioniert Base64? Der folgende Artikel stellt Ihnen vor, wie Sie Node.js zum Codieren und Decodieren von Strings mit Base64 verwenden. Ich hoffe, er wird Ihnen hilfreich sein!

Eine kurze Diskussion darüber, wie Strings in NodeJS mit Base64 kodiert und dekodiert werden

Was ist Base64-Kodierung?

Base64-Kodierung ist eine Methode zur Konvertierung von Daten (normalerweise binär) in den ASCII-Zeichensatz. Base64 wird aufgrund seiner Fähigkeit, Daten zu verbergen, oft mit einer Verschlüsselungstechnologie verwechselt. Es muss betont werden, dass es sich bei Base64 nicht um eine Verschlüsselungs- oder Komprimierungstechnologie handelt. Tatsächlich beträgt die Größe der Base64-codierten Informationen das 1,3333-fache der tatsächlichen Größe der Originaldaten. [Empfohlenes Lernen: „nodejs Tutorial“]

Verstehen: Angenommen, wir haben 6 ASCII-Zeichen, dann sind die Binärdaten 6 * 8 = 48 (Bits). Wenn die Base64-Kodierung verwendet wird, wird sie in 48/6 = 8 (Gruppen) unterteilt, und jede Gruppe entspricht einem ASCII-Zeichen. Das heißt, nach der Base64-Kodierung haben wir 8 ASCII-Zeichen. Da Daten bei der Übertragung in elektrische Signale umgewandelt werden (obwohl es sich bei dem, was Sie sehen, um Zeichen handelt), wird die Größe der Daten in Bits berechnet: 8 * 8 = 64 (Bits), 64 / 48 = 4 / 3 ≈ 1,3333 . Zusammenfassend beträgt die Größe der Base64-codierten Informationen das 1,3333-fache der tatsächlichen Größe der Originaldaten.

Base64 ist die am weitesten verbreitete grundlegende Kodierungstechnologie, die anderen beiden häufig verwendeten Kodierungsschemata sind Base16 und Base32.

Wie funktioniert Base64?

Die Konvertierung von Daten in Base64 ist ein mehrstufiger Prozess. So funktioniert es für Textzeichenfolgen:

  1. Berechnen Sie die 8-Bit-Binärversion des Eingabetextes.
  2. Gruppieren Sie die 8-Bit-Version in 6-Bit-Einheiten.
  3. Finden Sie jeden 6-Bit-Binärblock. Die Dezimalversion;
  4. Erhalten Sie das Base64-Symbol, das jedem Dezimalwert entspricht, indem Sie die Base64-Codierungstabelle abfragen.

Um dieses Konzept besser zu verstehen, schauen wir uns ein Beispiel an. Nehmen wir an, wir haben die Zeichenfolge „Go win“ und möchten sie in eine Base64-Zeichenfolge konvertieren. Der erste Schritt besteht darin, diese Zeichenfolge in eine Binärdatei umzuwandeln. Die binäre Version von „Go win“ lautet:

01000111 01101111 00100000 01110111 01101001 01101110
Nach dem Login kopieren

Hier können Sie sehen, dass jedes Zeichen durch 8 Bits dargestellt wird. Wie bereits erwähnt, konvertiert Base64 jedoch Daten von 8-Bit-Bins in 6-Bit-Bins. Das liegt daran, dass das Base64-Format nur 64 Zeichen hat: 26 Großbuchstaben, 26 Kleinbuchstaben, 10 numerische Zeichen und die Symbole „+“ und „/“ für Zeilenumbrüche.

Base64 verwendet nicht alle ASCII-Sonderzeichen, sondern nur diese wenigen. Beachten Sie, dass einige Implementierungen von Base64 andere Sonderzeichen als „+“ und „/“ verwenden.

Zurück zu diesem Beispiel: Teilen wir die 8-Bit-Daten in Gruppen von 6 Bits auf.

010001 110110 111100 100000 011101 110110 100101 101110
Nach dem Login kopieren

Sie können die Daten nicht immer in vollständige 6-Bit-Sätze aufteilen. In diesem Fall müssen Sie die Nullen manuell auffüllen.

Jetzt müssen wir für jeden Block oben seinen Dezimalwert ermitteln. Diese Dezimalwerte sind unten angegeben:

Binary Decimal 
010001 17 
110110 54 
111100 60 
100000 32 
011101 29 
110110 54 
100101 37 
101110 46
Nach dem Login kopieren

Zuletzt müssen wir uns den Base64-Wert jeder Dezimalzahl ansehen, die wir gerade aus den Binärdaten berechnet haben. Die Base64-Codierungstabelle sieht folgendermaßen aus:

Eine kurze Diskussion darüber, wie Strings in NodeJS mit Base64 kodiert und dekodiert werden

Hier sehen Sie, dass 17 in Dezimalzahl „R“ entspricht, 54 in Dezimalzahl „2“ entspricht und so weiter. Anhand dieser Codierungstabelle können wir sehen, dass die Zeichenfolge „Go win“ mit Base64 als „R28gd2lu“ codiert ist. Sie können dieses Ergebnis mit einem beliebigen Online-Text-zu-Base64-Konverter überprüfen.

Warum Base64-Kodierung verwenden?

Das Senden von Informationen im Binärformat kann manchmal riskant sein, da nicht alle Anwendungen oder Netzwerksysteme mit rohen Binärdateien umgehen können. Der ASCII-Zeichensatz hingegen ist allgemein bekannt und für die meisten Systeme sehr einfach zu handhaben.

E-Mail-Server benötigen beispielsweise Textdaten, daher wird häufig ASCII verwendet. Wenn Sie also ein Bild oder eine andere Binärdatei an einen E-Mail-Server senden möchten, müssen Sie diese zunächst in ein textbasiertes Format, vorzugsweise ASCII, kodieren. Hier bietet sich die Base64-Kodierung an, um Binärdaten in das richtige Format zu konvertieren.

Base64-Kodierung eines Strings mit Node.js

Der einfachste Weg, einen Base64-String in Node.js zu kodieren, ist über ein Buffer-Objekt. In Node.js ist Buffer ein globales Objekt, was bedeutet, dass Sie es nicht mit einer Require-Anweisung in Ihre Anwendung importieren müssen, um das Buffer-Objekt zu verwenden.

在物理内存中,缓冲区是一个不可变的整数数组,它也能够执行许多不同的编码/解码。这些包括到从 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 + '"');
Nach dem Login kopieren

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

$ node encode-text.js 
"stackabuse.com" converted to Base64 is "c3RhY2thYnVzZS5jb20="
Nach dem Login kopieren

在输出中,我们可以看到转换为 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 + '"');
Nach dem Login kopieren

将数据添加到 “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);
Nach dem Login kopieren

在上面的代码中,我们通过 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=
Nach dem Login kopieren

虽然实际图像非常小(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');
Nach dem Login kopieren

在这里您可以看到我们从 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/

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

Das obige ist der detaillierte Inhalt vonEine kurze Diskussion darüber, wie Strings in NodeJS mit Base64 kodiert und dekodiert werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:juejin.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!