返回顶部
首页 > 资讯 > 前端开发 > html >Node.js中Buffer对象怎么用
  • 764
分享到

Node.js中Buffer对象怎么用

2024-04-02 19:04:59 764人浏览 八月长安
摘要

小编给大家分享一下node.js中Buffer对象怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Buffer 是 node.js 的内置类型,它是用来表示内存中一块区域的,用以保存二

小编给大家分享一下node.js中Buffer对象怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

Buffer 是 node.js 的内置类型,它是用来表示内存中一块区域的,用以保存二进制数据,可以将它看做为一个二进制数组

Buffer 可以用来表示图片、视频这样的二进制数据,另外我们从文件中读取到的也是 Buffer 类型的数据,从网络中接收的数据也是 Buffer 类型的数据,所以学习 Buffer 还是很有必要的。

Buffer 位于全局作用域中,所以不需要通过 require('buffer') 来引入 Buffer。

创建 Buffer 对象

alloc

我们可以通过 Buffer.alloc(size, [fill], [encoding]) 来分配一个 size 字节大小的内存,还可以接收两个可选参数

  • fill:使用 fill 来填充 Buffer 中的每一个字节

  • encoding:如果 fill 为字符串,那么使用 encoding 来对字符串进行编码为二进制

当不指定 fill 参数,默认为填充 0。

const buf1 = Buffer.alloc(5);
console.log(buf1); // <Buffer 00 00 00 00 00>

const buf2 = Buffer.alloc(10, 1);
console.log(buf2); // <Buffer 01 01 01 01 01 01 01 01 01 01>

const buf3 = Buffer.alloc(12, "hello world!", "utf-8");
console.log(buf3); // <Buffer 68 65 6c 6c 6f 20 77 6f 72 6c 64 21>

我们还可以使用 allocUnsafe(size) 来分配指定大小的内存,不过不会默认填充 0,其中的内容不确定

const buf = Buffer.allocUnsafe(5);
console.log(buf); // <Buffer c0 84 7c 2a 7b>

我们可以通过 fill(fill, encoding) 方法为 Buffer 对象填充指定值

const buf = Buffer.allocUnsafe(5);
buf.fill(0);
console.log(buf); // <Buffer 00 00 00 00 00>

from

我们也可以通过 Buffer.from() 方法来创建一个 Buffer 对象,from 方法可以接收的参数包括数组,字符串,Buffer 对象,对象等类型。

接收一个整形数组,数组中的整数应该在 0~255 之间,超出此范围的数字将会被截断

const buf = Buffer.from([1, 2, 3, 4, 5]);
console.log(buf); // <Buffer 01 02 03 04 05>

我们还可以像其中传入一个字符串,并指定编码,它会使用指定编码将字符串编码为二进制,如果不指定编码的话,默认为编码为 utf-8

const buf = Buffer.from("hello", "utf-8");
console.log(buf); // <Buffer 68 65 6c 6c 6f>

from 方法还可以接收一个 Buffer 对象,它会拷贝传入的 Buffer 对象中的数据到新的 Buffer 对象中

const buf1 = Buffer.from("hello", "utf-8");
const buf2 = Buffer.from(buf1);

console.log(buf1 === buf2); // false
console.log(buf2.toString()); // hello

from 方法还可以接收一个对象,当传入对象,首先会将对象转化为原始值,然后根据原始值转化为对应的二进制数组

let obj = {
  [Symbol.toPrimitive](hint) {
    return "a";
  },
};

const buf = Buffer.from(obj);
console.log(buf.toString()); // a

Buffer 对象的属性

length

通过 length 属性可以知道 Buffer 数组的长度

const buf = Buffer.from("Hello World!");

console.log(buf.length); // 12

buffer

Buffer 对象内部实际存储数据的是一个 ArrayBuffer 的对象,通过 buffer 属性可以得到这个对象

const buf = Buffer.alloc(5);

console.log(buf.buffer); // ArrayBuffer { [Uint8Contents]: <00 00 00 00 00>, byteLength: 5 }

读 Buffer 对象

本节介绍如何访问 Buffer 对象中的内容。

下标

在文章的开头提过,我们可以将 Buffer 对象看做是一个二进制数组,既然是数组,那么就可以通过下标的形式来访问数组中的内容。

const buf = Buffer.from([1, 2, 3, 4, 5]);
console.log(buf[0]); // 1
console.log(buf[5]); // undefined

它们会以补码的形式解析字节,返回对应的数字。

readXxx

我们还可以通过 buf.readInt8() buf.readInt16() buf.readUint8() buf.readUint16() 等方法来访问 Buffer 对象中的内容。

const buf = Buffer.from([1, 2, 3, 4, 5]);
console.log(buf.readInt8(2)); // 3

// 访问超出范围的内容,会抛出 RangeError
console.log(buf.readInt8(5)); // RangeError [ERR_OUT_OF_RANGE]: The value of "offset" is out of range.

迭代器

Buffer 对象的迭代器同数组的迭代器相同,也有三个迭代器,分别是

  • entries

  • keys

  • values

我们通过遍历迭代器来访问 Buffer 对象中的内容。

const buf = Buffer.from([3, 4, 2]);

for (let entry of buf.entries()) {
  // 数组的一个元素为下标,第二个元素为下标对应的元素
  console.log(entry); // [ 0, 3 ]
                      // [ 1, 4 ]
                      // [ 2, 2 ]
}
for (let key of buf.keys()) {
  console.log(key); // 0
                    // 1
                    // 2
}
for (let value of buf.values()) {
  console.log(value); // 3
                      // 4
                      // 2
}

写 Buffer 对象

本小节讲解如何向 Buffer 对象中写入内容。

下标

我们可以直接通过下标来改变 Buffer 对象中的内容

const buf = Buffer.from([1, 2, 3]);

// 通过下标设置值
buf[0] = 4;

console.log(buf); // <Buffer 04 02 03>

write

我们可以通过 write(string, [offset], [length], [encoding]) 方法向 Buffer 中写入字符串:

  • string:表示要写入的字符串

  • offset:偏移量,即跳过 offset 个字节开始写入,默认为 0

  • length:要写入的最大字节数,不超过 buf.length - offset,默认值为 buf.length - offset

  • encoding:指定编码,默认为 utf-8

该方法返回已写入的字节数。

const buf = Buffer.from([1, 2, 3, 4]);

// 跳过 1 个字节开始写入,1hi4
buf.write("hi", 1);

console.log(buf); // <Buffer 01 68 69 04>

writeXxx

同 readXxx,我们可以通过 writeInt8() 方法向 buf 中写入数据,方法接收两个参数:

  • value:要写入的值

  • offset:偏移量,默认为 0

const buf = Buffer.alloc(5);

buf.writeInt8(1, 0);
buf.writeInt8(3, 1);

console.log(buf); // <Buffer 01 03 00 00 00>

踩坑:没有 writeInt16(),不过有 writeInt16BE()writeInt16LE(),分别代表以大端序、小端序写入。

其他方法

isBuffer

该方法接收一个对象,用来判断该对象是不是一个 Buffer 对象

let obj1 = {};
let obj2 = Buffer.alloc(3);

console.log(Buffer.isBuffer(obj1)); // false
console.log(Buffer.isBuffer(obj2)); // true

isEncoding

该方法接收一个代表编码的字符串,返回 Buffer 是否支持该种编码,如果支持则返回 true,否则返回 false

console.log(Buffer.isEncoding("utf-8")); // true
console.log(Buffer.isEncoding("utf8"));  // true
console.log(Buffer.isEncoding("hex"));   // true
console.log(Buffer.isEncoding("latin")); // false
console.log(Buffer.isEncoding("gbk"));   // false

slice

slice(start, end) 可以裁切原有的 Buffer 对象,返回一个新的 Buffer 对象,其中 start 和 end 代表裁切的起始位置和结束位置,左闭右开 [start, end),这两个参数是可选的,start 默认为 0,end 默认为 buf.length。返回的 Buffer 对象与原先对象引用的是同一块内存,即它们的 buffer 属性是一样的。

const buffer = Buffer.from("hello world!");

const newBuffer = buffer.slice(6); // 裁切 6 以后的内容到新数组
console.log(newBuffer.toString()); // world!

console.log(buffer.buffer === newBuffer.buffer); // true

subarray

subarray(start, end) 几乎可以看做等同于 slice 方法了,二者的语义不同,不过行为确实一致的,subarray 的语义表示返回原数组的某个范围的子数组,而 slice 的语义表示的裁切。同样 subarray 返回新的 Buffer 对象,并且返回的 Buffer 对象的 buffer 与原 Buffer 对象的 buffer 属性是相同的。

const buffer = Buffer.from("hello world!");

const newBuffer = buffer.subarray(6);
console.log(newBuffer.toString()); // world!

console.log(buffer.buffer === newBuffer.buffer); // true

copy

copy(target, [targetStart], [sourceStart], [sourceEnd]) 方法是将 source 从 sourceStart 到 sourceEnd 的内容复制到 target 从 targetStart 的位置,见下动图

Node.js中Buffer对象怎么用

除了 target 以外,其他三个参数都是可选参数,targetStart 与 sourceStart 的默认值为 0,sourceEnd 的默认值为 buf.length.

const buf1 = Buffer.from("HelloWorld");
const buf2 = Buffer.alloc(8);

buf1.copy(buf2, 0, 1, 9);

console.log(buf2.toString()); // elloWorl

includes

buf.includes(value, [offset], [encoding]) 方法的作用是判断 value 是否在 buf 中。

value 可以是一个字符串,也可以是一个 Buffer 对象,也可以是一个整数;offset 用来规定查找范围,表示从 offset 处开始查找,默认为 0;enconding 表示编码,默认为 utf-8

const buf = Buffer.from("HelloWorld");

// 默认从 0 开始搜索
console.log(buf.includes("H")); // true
// 从 1 开始搜索,后面不包含 H
console.log(buf.includes("H", 1)); // false

console.log(buf.includes(Buffer.from("Hello"))); // true

// H 对应的 utf-8 编码为 72
console.log(buf.includes(72)); // true

indexOf

buf.indexOf(value, [offset], [encoding]) 是用来查找 value 在 buf 中的下标的,参数的含义同 includes 方法相同,如果在 buf 找不到 value,那么会返回 -1,所以 includes(value) 方法其实就相当于 indexOf(value) !== -1

const buf = Buffer.from("HelloWorld");

console.log(buf.indexOf("H")); // 0
console.log(buf.indexOf("H", 1)); // -1
console.log(buf.indexOf(Buffer.from("World"))); // 5
console.log(buf.indexOf(72)); // 0

equals

buf.equals(otherBuffer) 是比较两个 Buffer 对象的字节是否完全相同,如果相同,则返回 true,否则返回 false

const buf1 = Buffer.alloc(5);
const buf2 = Buffer.alloc(5);
const buf3 = Buffer.allocUnsafe(5);

console.log(buf1.equals(buf2)); // true
console.log(buf1.equals(buf3)); // false

看完了这篇文章,相信你对“Node.js中Buffer对象怎么用”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网html频道,感谢各位的阅读!

--结束END--

本文标题: Node.js中Buffer对象怎么用

本文链接: https://lsjlt.com/news/87973.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Node.js中Buffer对象怎么用
    小编给大家分享一下Node.js中Buffer对象怎么用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Buffer 是 Node.js 的内置类型,它是用来表示内存中一块区域的,用以保存二...
    99+
    2024-04-02
  • node.js中Buffer对象有什么用
    这篇文章将为大家详细讲解有关node.js中Buffer对象有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Buffer对象,是Node的核心模块,在面试中也是会频...
    99+
    2024-04-02
  • Node.js中的Buffer对象及创建方式
    目录什么是Buffer?注意Buffer中存储的都是二进制数据,但是在显示时以16进制显示Buffer.length表示占用内存的大小Buffer打印数字时会以十进制方式显示Buff...
    99+
    2024-04-02
  • Node.js中的Buffer对象及创建方式是什么
    Node.js中的Buffer对象及创建方式是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是Buffer?js语言自身只有字符串数据类型,没有二进制数据类型,而处...
    99+
    2023-06-26
  • Node.js的模块化机制和Buffer对象是什么
    本篇内容主要讲解“Node.js的模块化机制和Buffer对象是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Node.js的模块化机制和Buffer对象是什么”吧!一、Node.js的模块...
    99+
    2023-06-29
  • Node.js中Buffer有什么用
    小编给大家分享一下Node.js中Buffer有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!在Node.js中,Buff...
    99+
    2024-04-02
  • Node.js的模块化机制和Buffer对象详解
    目录一、Node.js的模块化机制1、什么是CommonJS模块规范2、CommonJS模块规范化的内容3、每个导出的模块都有一个moudle对象,该对象包含的属性有:4、使用req...
    99+
    2024-04-02
  • Node.js实用代码段之获取Buffer对象字节长度
    我们知道Node.js框架下的Buffer对象能够对二进制数据提供很好的支持,那么获取一个Buffer对象真实的字节长度则是必须要用到的功能了。Node.js框架为开发人员提供了一个Buffer.byteL...
    99+
    2022-06-04
    字节 长度 对象
  • nodeJS中怎么实现一个二进制buffer对象
    nodeJS中怎么实现一个二进制buffer对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。 概述由于应用场景不同...
    99+
    2024-04-02
  • Node.js的Buffer模块怎么使用
    这篇文章主要介绍“Node.js的Buffer模块怎么使用”,在日常操作中,相信很多人在Node.js的Buffer模块怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”...
    99+
    2024-04-02
  • 怎么理解Node.js中的Buffer模块
    这篇文章主要讲解了“怎么理解Node.js中的Buffer模块”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Node.js中的Buffer模块”吧!...
    99+
    2024-04-02
  • Node.js中ES6模块化及Promise对象怎么使用
    本文小编为大家详细介绍“Node.js中ES6模块化及Promise对象怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Node.js中ES6模块化及Promise对象怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-02
  • Node.js中怎么实现一个全局对象
    Node.js中怎么实现一个全局对象,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Node.js 全局对象现在介绍 Node....
    99+
    2024-04-02
  • Node.js 中全局对象如何使用
    这篇文章将为大家详细讲解有关Node.js 中全局对象如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Node.js 基础教程之全局对象在浏览器 Ja...
    99+
    2024-04-02
  • Node.js中的全局对象是什么
    这篇文章将为大家详细讲解有关Node.js中的全局对象是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。所谓全局对象,就是可以直接访问的对象,比如浏览器中的的全局对象就...
    99+
    2024-04-02
  • 怎么在Node.js中将字符串转为JS对象
    这篇文章主要讲解了“怎么在Node.js中将字符串转为JS对象”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么在Node.js中将字符串转为JS对象”吧!JSON.parse()方法JSO...
    99+
    2023-07-05
  • js中对象怎么用
    这篇文章给大家分享的是有关js中对象怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。对象1 使用解构删除不必要属性有时候你不希望保留某些对象属性,也许是因为它们包含敏感信息或...
    99+
    2024-04-02
  • JavaScript中Math对象怎么用
    这篇文章主要介绍了JavaScript中Math对象怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Math对象属性:Math对象方法:...
    99+
    2024-04-02
  • HTML5中FileReader对象怎么用
    这篇文章主要介绍HTML5中FileReader对象怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!写在前面前一篇文章介绍了HTML5中的Blob对象(详情戳这里),从中了解到Blob对象只是二进制数据的容器,本...
    99+
    2023-06-09
  • ADO.NET中SqlCommand对象怎么用
    小编给大家分享一下ADO.NET中SqlCommand对象怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ADO.NET经过长时间的发展,很多用户都很了解AD...
    99+
    2023-06-17
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作