浅析NodeJS中的Buffer

浅析NodeJS中的Buffer

相关推荐:《node js教程》

当年是看了朴灵的九浅一深 NodeJS 入门的 Node, 朴大大的书讲实践很少更多的篇幅用在了讲原理上,道理听了那么多,后来开始在前端工程领域使用 NodeJS 却处处掣肘,总结原因发现 NodeJS 中难的部分无非是文件和网络,文件操作和网络都依赖了一个很重要的对象—— Stream,这恰恰是朴大大书中没有提及的。

Buffer 朴大大在书中是有提到过的,但因为流实际上就是在处理 Buffer,所以还是要简单总结一下。

什么是 Buffer

如同官方 API 中介绍的那样,在 ES6 引入 TypedArray 之前,JavaScript 没有读取或者操作二进制数据流的机制。 Buffer 类作为 NodeJS API 的一部分被引入,以便能够和 TCP 等网络流和文件流等进行交互。

现在 TypedArray 已经被添加到了 ES6 中,Buffer 类以一种更优化和适用于 NodeJS 操作的方式实现了 Unit8Array API。

总而言之,Buffer 类是用来处理二进制数据,因为太常用了,所以直接放在了全局变量里,使用的时候无需 require。

Buffer 类的实例类似于整型数组,不过缓冲区的大小在创建时确定,不能调整。Buffer 对象不同之处在于它不经 V8 的内存分配机制,Buffer 是一个 JavaScript 和 C++ 结合的模块,内存由 C++ 申请,JavaScript 分配。

关于 Buffer 内存分配相关知识不展开讨论,感兴趣同学可以看看朴老湿的书。

实例化 Buffer

在 NodeJS v6 之前都是通过调用构造函数的方式实例化 Buffer,根据参数返回不同结果。处于安全性原因,这种方式在 v6 后的版本中已经被废除,提供了

Buffer.from()Buffer.alloc()Buffer.allocUnsafe()

三个单独的,职责清晰的函数处理实例化 Buffer 的工作。

Buffer.from(array):返回一个内容包含所提供的字节副本的 Buffer,数组中每一项是一个表示八位字节的数字,所以值必须在 0 ~ 255 之间,否则会取模Buffer.from(arrayBuffer):返回一个与给定的 ArrayBuffer 共享内存的新 BufferBuffer.from(buffer):返回给定 Buffer 的一个副本 BufferBuffer.from(string [, encoding]):返回一个包含给定字符串的 BufferBuffer.alloc(size [, fill [, encoding]]):返回指定大小并且“已填充”的 BufferBuffer.allocUnsafe(size):返回指定大小的 Buffer,内容必须用 buf.fill(0) 等方法填充

// 0x 表示 16 进制Buffer.from([1, 2, 3]) // [0x1, 0x2, 0x3]Buffer.from('test', 'utf-8') // [0x74, 0x65, 0x73, 0x74]Buffer.alloc(5, 1) // [0x1, 0x1, 0x1, 0x1, 0x1]Buffer.allocUnsafe(5); // 值不确定,后面详谈

登录后复制

Buffer.allocUnsafe() 的执行会快于 Buffer.alloc() 看名字很不安全,确实也不安全。

当调用 Buffer.allocUnsafe() 时分配的内存段尚未初始化(不归零),这样分配内存速度很块,但分配到的内存片段可能包含旧数据。如果在使用的时候不覆盖这些旧数据就可能造成内存泄露,虽然速度快,尽量避免使用。

编码

Buffer 支持以下几种编码格式

asciiutf8utf16lebase64binaryhex

Buffer 和 String 转换

字符串转为 Buffer 比较简单

Buffer.from(string [, encoding])

登录后复制

同时 Buffer 实例也有 toString 方法将 Buffer 转为字符串

buf.toString([encoding[, start[, end]]])

登录后复制

Buffer 拼接

使用 concat 方法可以讲多个 Buffer 实例拼接为一个 Buffer 实例

Buffer.concat(list[, totalLength])

登录后复制

StringDecoder

在 NodeJS 中一个汉字由三个字节表示,如果我们处理中文字符的时候使用了不是3的倍数的字节数就会造成字符拼接乱码问题。

const buf = Buffer.from('中文字符串!');for(let i = 0; i < buf.length; i+=5){  var b = Buffer.allocUnsafe(5);  buf.copy(b, 0, i);  console.log(b.toString());}

登录后复制

这样可以看到结果中出现了乱码

浅析NodeJS中的Buffer

但如果使用 string_decoder 模块便可以解决这个问题

const StringDecoder = require('string_decoder').StringDecoder;const decoder = new StringDecoder('utf8');const buf = Buffer.from('中文字符串!');for(let i = 0; i < buf.length; i+=5){  var b = Buffer.allocUnsafe(5);  buf.copy(b, 0, i);  console.log(decoder.write(b));}

登录后复制

StringDecoder 在得到编码后,知道宽字节在utf-8下占3个字节,所以在处理末尾不全的字节时,会保留到第二次 write()。目前只能处理UTF-8、Base64 和 UCS-2/UTF-16LE。

Buffer 其它常用 API

还有一些 Buffer 常用的 API

Buffer.isBuffer:判断对象是否为 BufferBuffer.isEncoding:判断 Buffer 对象编码buf.length:返回 内存为此 Buffer 实例所申请的字节数,并不是 Buffer 实例内容的字节数buf.indexOf:和数组的 indexOf 类似,返回某字符串、acsii 码或者 buf 在改 buf 中的位置buf.copy:将一个 buf 的(部分)内容复制到另外一个 buf 中

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

以上就是浅析NodeJS中的Buffer的详细内容,更多请关注【创想鸟】其它相关文章!

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

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

(0)
上一篇 2025年3月7日 23:03:53
下一篇 2025年2月28日 00:44:54

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

相关推荐

  • 了解NodeJS中的可读流

    相关推荐:《node js教程》 什么是可读流 可读流是生产数据用来供程序消费的流。我们常见的数据生产方式有读取磁盘文件、读取网络请求内容等,看一下前面介绍什么是流用的例子: const rs = fs.createReadStream(f…

    2025年3月7日
    200
  • Nodejs中什么是可写流?怎么使用

    相关推荐:《nodejs 教程》 什么是可写流 可写流是对数据流向设备的抽象,用来消费上游流过来的数据,通过可写流程序可以把数据写入设备,常见的是本地磁盘文件或者 TCP、HTTP 等网络响应。 看一个之前用过的例子 process.std…

    2025年3月7日
    200
  • 浅谈Nodejs中的​双工流

    相关推荐:《node js教程》 双工流就是同时实现了 Readable 和 Writable 的流,即可以作为上游生产数据,又可以作为下游消费数据,这样可以处于数据流动管道的中间部分,即 rs.pipe(rws1).pipe(rws2).…

    2025年3月7日
    200
  • 如何使用Llama Logs显示和调试NodeJS错误?

    本篇文章给大家介绍一下node开发神器–llama logs,使用llama logs实时可视化node错误。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 相关推荐:《nodejs 教程》 你是否想知道程序内…

    2025年3月7日
    200
  • 使用Node.js+Vue.js来构建文件压缩应用程序

    相关推荐:《node js教程》 Node.js为我们提供了一个模块来协助文件压缩。在本文中,我们将构建一个应用程序,用户可以在该应用程序中上传他们想要压缩的文件,然后使用Node.js Zlib模块下载该文件的压缩版本。 前提 要继续学习…

    2025年3月7日 编程技术
    200
  • 23个需要了解的十分有用的nodejs库(推荐)

    相关推荐:《node js教程》 作为专业的开发人员,我们必须不断更新最新和最好的库,因为知道好的库,那么开发过程就可以依赖于它们,这会节省我们很多时间也有助于构建高质量的软件。 下面列表常见且好用的 NodeJS 库,反正我自己是已经收藏…

    2025年3月7日 编程技术
    200
  • 详解Node.js中的事件

    相关推荐:《nodejs 教程》 前端对事件肯定不陌生,为 window 绑定 scroll 事件 window.addEventListener(‘scroll’, ev => {console.log(ev);}); 登录后复制 …

    2025年3月7日
    200
  • 了解Node.js中的process对象

    相关推荐:《node js教程》 process 对象是一个全局变量,是一个 EventEmitter 实例,提供了当前 Node.js 进程的信息和操作方法 系统信息 process 对象提供了属性用于返回关键系统信息,常用的有 titl…

    2025年3月7日
    200
  • 提示Node应用性能的5个技巧

    相关推荐:《node js教程》 “如果你的 node 服务器前面没有 nginx, 那么你可能做错了。”— Bryan Hughes Node.js 是使用 最流行的语言— JavaScript 构建服务器端应用的领先工具 。由于可以同时…

    2025年3月7日
    200
  • 了解Node.js中的定时器

    相关推荐:《node js教程》 timer 用于安排函数在未来某个时间点被调用,Node.js 中的定时器函数实现了与 Web 浏览器提供的定时器 API 类似的 API,但是使用了事件循环实现,Node.js 中有四个相关的方法 set…

    2025年3月7日
    200

发表回复

登录后才能评论