浅谈nodejs中怎么对字符串进行Base64编码和解码

什么是base64编码?base64是如何工作的?下面本篇文章给大家介绍一下使用node.js对字符串进行 base64编码和解码的方法,希望对大家有所帮助!

浅谈nodejs中怎么对字符串进行Base64编码和解码

什么是 Base64 编码?

Base64 编码是一种将数据(通常是二进制)转换为 ASCII 字符集的方法。Base64 因为能够起到隐藏数据的效果而常常被误认为是一种加密技术。值得强调的是, Base64 不是一种加密或压缩技术。实际上,Base64 编码信息的大小是原始数据实际大小的 1.3333 倍。【推荐学习:《node.js》】

理解:假设我们有 6 个 ASCII 字符,那么二进制数据就是 6 * 8 = 48(位)。如果使用 Base64 编码的话,那么就会分成 48 / 6 = 8(组),每一组就会对应一个 ASCII 字符,也即是说,经过 Base64 编码后,我们会有 8 个 ASCII 字符。因为数据传输的时候都会被转换为电信号(虽然你看到的是字符),所以数据的大小都是按位来算的,8 个 ASCII 字符就是 8 * 8 = 64(位),64 / 48 = 4 / 3  ≈ 1.3333 。 综上所述,Base64 编码信息的大小是原始数据实际大小的 1.3333 倍。

Base64 是使用最广泛的基本编码技术,另外两种常用的编码方案是 Base16 和 Base32。

Base64 是如何工作的?

将数据转换为 base64 是一个多步骤的过程。以下是它对文本字符串的工作方式:

计算输入文本的 8 位二进制版本;将 8 位版本的数据重新以 6 位为一单元去分组;找到每个 6 位二进制块的十进制版本;通过查询 Base64 编码表获得每个十进制值所对应的 Base64 符号。

为了更好地理解这个概念,让我们看一个例子。假设我们有字符串“Go win”,我们想将其转换为 Base64 字符串。第一步是将此字符串转换为二进制。 “Go win”的二进制版本是:

01000111 01101111 00100000 01110111 01101001 01101110

登录后复制

您可以在此处看到每个字符由 8 位表示。然而,正如我们之前所说,Base64 将 8 位二进制为一组形式的数据转换为 6 位为一组形式的数据。这是因为 Base64 格式只有 64 个字符:26 个大写字母、26 个小写字母、10 个数字字符以及用于换行的“+”和“/”符号

Base64 不使用所有的 ASCII 特殊字符,而只使用这几个。请注意,Base64 的某些实现使用与“+”和“/”不同的特殊字符。

回到这个例子,让我们将 8 位数据分成 6 位为一组。

010001 110110 111100 100000 011101 110110 100101 101110

登录后复制

您不会总是能够将数据分成完整的 6 位集,在这种情况下,您将不得不手动填充 0 。

现在对于上面的每个块,我们必须找到它的十进制值。下面给出了这些十进制值:

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

登录后复制

最后,我们必须查看我们刚刚从二进制数据计算出的每个十进制数的 Base64 值。 Base64 编码表如下所示:

1.png

在这里你可以看到十进制的 17 对应于“R”,十进制的 54 对应于“2”,依此类推。使用此编码表,我们可以看到字符串“Go win”使用 Base64 编码为“R28gd2lu”。您可以使用任何在线文本转 Base64 转换器来验证此结果。

为什么要使用 Base64 编码?

以二进制格式发送信息有时会有风险,因为并非所有应用程序或网络系统都可以处理原始二进制文件。另一方面,ASCII 字符集广为人知,并且对于大多数系统来说处理起来非常简单。

例如,电子邮件服务器需要文本数据,因此通常使用 ASCII。因此,如果您想将图片或任何其他二进制文件发送到电子邮件服务器,您首先需要将其编码为基于文本的格式,最好是 ASCII。这就是 Base64 编码在将二进制数据转换为正确格式方面非常方便的地方。

使用 Node.js 对字符串进行 Base64 编码

在 Node.js 中对 Base64 字符串进行编码的最简单方法是通过 Buffer 对象。在 Node.js 中,Buffer 是一个全局对象,这意味着你不需要使用 require 语句导入应用程序就可以使用 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 + '"');

登录后复制

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

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

登录后复制

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

登录后复制

将数据添加到 “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:' + base64data);

登录后复制

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

登录后复制

虽然实际图像非常小(25×19),但输出仍然相当大,部分原因是 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');

登录后复制

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

更多编程相关知识,请访问:node.js!!

以上就是浅谈nodejs中怎么对字符串进行Base64编码和解码的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2708239.html

(0)
上一篇 2025年3月7日 20:19:20
下一篇 2025年2月22日 22:31:23

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 怎么查看nodejs安装路径

    查看nodejs安装路径的两种方法:1、打开cmd命令行窗口,输入“where node”命令并回车即可输出nodejs的安装路径。2、打开“开始”菜单,找到并右击“Node.js”程序,在弹出菜单中点击“打开文件位置”即可查看安装路径。 …

    2025年3月7日 编程技术
    200
  • 怎么彻底删除nodejs

    彻底删除nodejs的方法:1、从卸载程序中卸载;2、从任务管理器中杀死所有与节点相关的进程;3、检查“%PATH%”环境变量;4、在命令提示符下输入where node并删除即可。 本文操作环境:Windows7系统、nodejs10.1…

    2025年3月7日
    200
  • 深入了解Node.js中的四大流,解决“背压”问题

    node.js的4种stream是什么?什么是背压问题?下面本篇文章就来带大家了解一下node.js中的四大流(stream),介绍一下背压问题和解决方法,希望对大家有所帮助! 把一个东西从 A 搬到 B 该怎么搬呢? 抬起来,移动到目的地…

    2025年3月7日 编程技术
    200
  • 一文快速了解Nodejs中的模块系统

    本篇文章带大家了解一下nodejs中的模块系统,希望对大家有所帮助! 模块化的背景 早期 JavaScript 是为了实现简单的页面交互逻辑, 但随着时代发展, 浏览器不单单仅只能呈现简单交互, 各种各样的网站开始大放光彩。随着网站开始变得…

    2025年3月7日
    200
  • linux 命令怎么安装nodejs

    linux命令安装nodejs的方法:1、选择一个合适的nodejs版本下载;2、通过“tar -xvf node-v10.6.0-linux-x64.tar.xz”命令将安装包上传到指定位置即可。 本文操作环境:linux5.9.8系统、…

    2025年3月7日
    200
  • nodejs怎么更改路径

    nodejs更改路径的方法:1、在安装目录下新建node_global等文件夹;2、在cmd窗口下执行“npm install gulp -g”命令;3、在环境变量配置的用户变量中增加一个配置即可。 本文操作环境:windows7系统、no…

    2025年3月7日
    200
  • nodejs如何升级

    升级nodejs的方法:1、利用n模块,使用“n stable”命令可升级到最新稳定版、“n latest”命令可升级到最新版;2、利用NVM工具,使用“nvm install lastest”可升级到最新版。 本教程操作环境:centos…

    2025年3月7日
    200
  • 快速搞懂Node.js中的性能指标

    本篇文章带大家了解一下node.js的性能指标,希望对大家有所帮助! 对于我们前端工程师来说,掌握Node.js应用开发是我们走上资深/专家的一条必经之路。此外Node.js是一门服务端语言,我们不仅要能够完成开发任务,而且更应该要关注服务…

    2025年3月7日 编程技术
    200
  • 浅谈如何使用Nodejs创建访问日志记录的中间件

    本篇文章给大家分享一下使用node.js实现接口访问日志记录功能,希望对大家有所帮助! 中间件-访问日志 目标 利用中间件技术,写一个用来记录访问日志的中间件 中间件 middleware, 中间件是一个特殊的url地址处理函数,它被当作 …

    2025年3月7日
    200
  • 如何解决nodejs express安装失败问题

    nodejs express安装失败的解决办法:1、切换到nodejs安装目录下;2、执行“npm install express”命令即可。 本文操作环境:windows7系统、nodejs10.16.2版、Dell G3电脑。 如何解决…

    2025年3月7日
    200

发表回复

登录后才能评论