nodejs之Buffer模块(缓冲流)基本操作

Node.js Buffer(缓冲区)

JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个Buffer类,该类用来创建一个专门存放二进制数据的缓存区

Buffer类存在的意义

  1. Buffer 类是随 Node 内核一起发布的核心库。Buffer 库可以存储原始数据,让Node.js 处理二进制数据;
  2. 每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。

Buffer类是以字节数组的方式进行存储数据

Buffer类的基本操作

创建Buffer类
Buffer.alloc(size[, fill[, encoding]]):返回一个指定大小的 Buffer 实例,如果没有设置 fill,则默认填满 0。

//创建一个长度为5、且用0x1填满的Buffer
const buf1 = Buffer.alloc(51);
//<Buffer 01 01 01 01 01>

Buffer.from(array): 使用0-255范围内的字节数组array来分配一个新的Buffer。如果array不是一个Array或适用于Buffer.from()变量的其他类型,则抛出TypeError。

//创建一个包含 [0x1, 0x2, 0x3] 的 Buffer。
const buf2 = Buffer.from([1, 2, 3]);
//<Buffer 0x1 0x2 0x3>
const buf4 = Buffer.from([0x42,0x75,0x66,0x66,0x65,0x72])
//若要验证buf4,利用toString()方法即可--返回一个解码过的 string 类型
console.log(buf4.toString());
//Buffer

// 创建一个包含 UTF-8 字节[0x42,0x75,0x66,0x66,0x65,0x72]的 Buffer。
const buf3 = Buffer.from('Buffer');
//<Buffer 42 75 66 66 65 72>

buf.toString()方法可以将指定的字符编码将buf解码成字符串。传入star和end可以只解码buf的子集

写入缓冲区
buf.write(string[, offset[, length]][, encoding]):返回实际写入的大小。如果 buffer 空间不足, 则只会写入部分字符串。根据 encoding 指定的字符编码将 string 写入到 buf 中的 offset 位置。

let buf = Buffer.alloc(5);
let len = buf.write('hello');
console.log(len);//5

//2表示要跳过两位
buf.write('hello',2,3)
console.log(buf);
//  hel

length 要写入的最大字节数(写入的字节数不会超出 buf.length - offset)。默认值: buf.length - offset。

== 判断Buffer类==
Buffer.isBuffer(obj):如果 obj 是一个 Buffer,则返回 true,否则返回 false。

const buf = Buffer.from('hello');
console.log(Buffer.isBuffer(buf));//true
console.log(Buffer.isBuffer({}));//false

检查字符编码名称
Buffer.isEncoding(encoding):如果 encoding 是支持的字符编码的名称,则返回 true,否则返回 false。

console.log(Buffer.isEncoding('utf-8'));
// 返回: true

console.log(Buffer.isEncoding('hex'));
// 返回: true

console.log(Buffer.isEncoding('utf/8'));
// 返回: false

console.log(Buffer.isEncoding(''));
// 返回: false

将 Buffer 转换为 JSON 对象
buf.toJSON():返回 buf 的 JSON 格式。 当字符串化 Buffer 实例时,JSON.stringify()会调用该函数。

const buf = Buffer.from('hello');
const json = JSON.stringify(buf);
console.log(json);
//{"type":"Buffer","data":[104,101,108,108,111]}

JSON.stringify()该方法是转换为json格式的字符串

返回Buffer的长度
Buffer.byteLength(string[, encoding]):当使用 encoding 进行编码时,返回字符串的字节长度。

let buf = Buffer.from('中国');
console.log(buf);//<Buffer e4 b8 ad e5 9b bd>
console.log(Buffer.byteLength(buf));//返回6
//返回的长度取决于编码格式

let buf1 = Buffer.from('中国','ascii');
console.log(Buffer.byteLength(buf2));//返回2

注意:utf-8的编码格式:一个字符=三个字节
ascii的编码格式:一个字符=一个字节

拼接Buffer类
Buffer.concat(list[, totalLength]):返回一个合并了 list 中所有 Buffer 实例的新 Buffer。

// 用含有三个 `Buffer` 实例的数组创建一个单一的 `Buffer`
const buf = Buffer.alloc(1);
console.log(buf.length);//1
const buf1 = Buffer.alloc(2);
console.log(buf1.length);//2
const buf2 = Buffer.alloc(3);
console.log(buf2.length);//3
const buf3 = Buffer.concat([buf,buf1]);
console.log(buf3);//<Buffer 00 00 00>

const buf1 = Buffer.from('tom');
const buf2 = Buffer.from('jerry');
const buf3 = Buffer.concat([buf1,buf2]);
console.log(Buffer.byteLength(buf3));
console.log(buf3.toString())
//8
//tomjerry

剪裁缓冲区
buf.slice([start[, end]]):返回一个新的 Buffer,它引用与原始的 Buffer 相同的内存,但是由 start 和 end 索引进行偏移和裁剪。

let buf = Buffer.from('hello');
let buf1 = buf.slice(2,3);
console.log(buf1);//<Buffer 6c>
console.log(buf1.toString());//1

总结

1.Buffer类的一些基本操作与数组的一些方法有共通之处,比如slice()方法、concat()方法等,因此我们可以联想记忆;
2.在js中每种编码格式的规则不同,返回Buffer类的长度时,会根据编码格式不同而不同,比如utf-8编码格式中,一个字符代表三个字节,ASCII中一个字符代表一个字节;
3.利用Buffer.from()方法返回的是16进制的结果,而通过Buffer.toJSON方法返回的是10进制的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值