Perbincangan ringkas tentang cara Base64 mengekod dan menyahkod rentetan dalam nodejs

青灯夜游
Lepaskan: 2021-09-08 10:49:18
ke hadapan
5541 orang telah melayarinya

Apakah pengekodan Base64? Bagaimanakah Base64 berfungsi? Artikel berikut akan memperkenalkan kepada anda cara menggunakan Node.js untuk mengekod dan menyahkod rentetan Base64 saya harap ia akan membantu anda.

Perbincangan ringkas tentang cara Base64 mengekod dan menyahkod rentetan dalam nodejs

Apakah pengekodan Base64?

Pengekodan Base64 ialah kaedah menukar data (biasanya binari) kepada set aksara ASCII. Base64 sering disalah anggap sebagai teknologi penyulitan kerana keupayaannya untuk menyembunyikan data. Perlu ditekankan bahawa Base64 bukanlah teknologi penyulitan atau pemampatan. Malah, saiz maklumat yang dikodkan Base64 ialah 1.3333 kali saiz sebenar data asal. [Pembelajaran yang disyorkan: "tutorial nodejs"]

Pemahaman: Dengan mengandaikan kita mempunyai 6 aksara ASCII, maka data binari ialah 6 * 8 = 48 (bit). Jika pengekodan Base64 digunakan, ia akan dibahagikan kepada 48 / 6 = 8 (kumpulan), dan setiap kumpulan akan sepadan dengan aksara ASCII Maksudnya, selepas pengekodan Base64, kita akan mempunyai 8 aksara ASCII. Kerana data ditukar kepada isyarat elektrik apabila dihantar (walaupun apa yang anda lihat adalah aksara), saiz data dikira dalam bit 8 aksara ASCII ialah 8 * 8 = 64 (bit), 64 / 48 = 4 / 3 ≈ 1.3333. . Ringkasnya, saiz maklumat yang dikodkan Base64 ialah 1.3333 kali saiz sebenar data asal.

Base64 ialah teknologi pengekodan asas yang paling banyak digunakan, dua lagi skim pengekodan yang biasa digunakan ialah Base16 dan Base32.

Bagaimanakah Base64 berfungsi?

Menukar data kepada base64 ialah proses berbilang langkah. Begini cara ia berfungsi untuk rentetan teks:

  1. Mengira versi perduaan 8-bit teks input
  2. Mengumpul semula versi 8-bit ke dalam unit 6-bit ;
  3. Cari versi perpuluhan bagi setiap blok binari 6-bit;
  4. Dapatkan simbol Base64 yang sepadan dengan setiap nilai perpuluhan dengan menanyakan jadual pengekodan Base64.

Untuk memahami konsep ini dengan lebih baik, mari lihat contoh. Katakan kita mempunyai rentetan "Go win" dan kita mahu menukarnya kepada rentetan Base64. Langkah pertama ialah menukar rentetan ini kepada binari. Versi binari "Go win" ialah:

01000111 01101111 00100000 01110111 01101001 01101110
Salin selepas log masuk

Anda boleh lihat di sini bahawa setiap aksara diwakili oleh 8 bit. Walau bagaimanapun, seperti yang kami katakan sebelum ini, Base64 menukar data binari 8-bit kepada data 6-bit. Ini kerana format Base64 hanya mempunyai 64 aksara: 26 huruf besar, 26 huruf kecil, 10 aksara angka dan simbol " " dan "/" untuk pemisah baris.

Base64 tidak menggunakan semua aksara khas ASCII, tetapi hanya beberapa aksara ini. Ambil perhatian bahawa sesetengah pelaksanaan Base64 menggunakan aksara khas yang berbeza daripada " " dan "/".

Kembali kepada contoh ini, mari bahagikan data 8-bit kepada kumpulan 6 bit.

010001 110110 111100 100000 011101 110110 100101 101110
Salin selepas log masuk

Anda tidak akan sentiasa dapat membahagikan data kepada set 6-bit yang lengkap, dalam kes ini anda perlu melapik 0 secara manual.

Kini untuk setiap blok di atas, kita perlu mencari nilai perpuluhannya. Nilai perpuluhan ini diberikan di bawah:

Binary Decimal 
010001 17 
110110 54 
111100 60 
100000 32 
011101 29 
110110 54 
100101 37 
101110 46
Salin selepas log masuk

Akhir sekali, kita perlu melihat nilai Base64 bagi setiap nombor perpuluhan yang baru kita kira daripada data binari. Jadual pengekodan Base64 kelihatan seperti ini:

Perbincangan ringkas tentang cara Base64 mengekod dan menyahkod rentetan dalam nodejs

Di sini anda boleh melihat bahawa 17 dalam perpuluhan sepadan dengan "R", 54 dalam perpuluhan sepadan dengan "2", dan seterusnya. Menggunakan jadual pengekodan ini, kita dapat melihat bahawa rentetan "Go win" dikodkan menggunakan Base64 sebagai "R28gd2lu". Anda boleh mengesahkan keputusan ini menggunakan mana-mana teks dalam talian ke penukar Base64.

Mengapa menggunakan pengekodan Base64?

Menghantar maklumat dalam format binari kadangkala boleh berisiko, kerana tidak semua aplikasi atau sistem rangkaian boleh mengendalikan fail binari mentah. Set aksara ASCII, sebaliknya, terkenal dan sangat mudah dikendalikan untuk kebanyakan sistem.

Sebagai contoh, pelayan e-mel memerlukan data teks, jadi ASCII sering digunakan. Jadi, jika anda ingin menghantar gambar atau mana-mana fail binari lain ke pelayan e-mel, anda perlu mengekodnya terlebih dahulu ke dalam format berasaskan teks, sebaik-baiknya ASCII. Di sinilah pengekodan Base64 berguna untuk menukar data binari ke dalam format yang betul.

Base64 mengekod rentetan menggunakan Node.js

Cara paling mudah untuk mengekod rentetan Base64 dalam Node.js ialah Melalui objek Penampan. Dalam Node.js, Penampan ialah objek global, yang bermaksud anda tidak perlu menggunakan pernyataan memerlukan untuk mengimport aplikasi untuk menggunakan objek Penampan.

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

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

$ node encode-text.js 
"stackabuse.com" converted to Base64 is "c3RhY2thYnVzZS5jb20="
Salin selepas log masuk

在输出中,我们可以看到转换为 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 + '"');
Salin selepas log masuk

将数据添加到 “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);
Salin selepas log masuk

在上面的代码中,我们通过 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=
Salin selepas log masuk

虽然实际图像非常小(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');
Salin selepas log masuk

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

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

Atas ialah kandungan terperinci Perbincangan ringkas tentang cara Base64 mengekod dan menyahkod rentetan dalam nodejs. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:juejin.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!