nodejs篇 Buffer模块

前言

在这里插入图片描述

Buffer对象是Node处理二进制数据的一个接口。它是Node原生提供的全局对象,可以直接使用,不需要require(‘buffer’)。

JavaScript比较擅长处理字符串,对于处理二进制数据(比如TCP数据流),就不太擅长。Buffer对象就是为了解决这个问题而设计的。它是一个构造函数,生成的实例代表了V8引擎分配的一段内存,是一个类似数组的对象,成员都为0到255的整数值,即一个8位的字节。

nodejs commonjs介绍
nodejs fs模块介绍
nodejs path模块介绍
nodejs events模块介绍
nodejs http模块介绍
nodejs net模块介绍
nodejs url模块介绍
nodejs process模块介绍

基本使用

创建一个buffer数据。

new Buffer()

var bin = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
// 第一个参数是buffer的内容,第二个参数则是buffer采用的编码方式。 即将废弃
var bin2 = new Buffer("hello", "utf-8");
console.log(bin[0]); // 104
console.log(bin.length); // 5
var str = bin.toString("utf-8");
console.log(str); // hello

Buffer.from()

// 第一个参数是buffer的内容,第二个参数则是buffer采用的编码方式,第二个参数默认是utf8。用Buffer.from 取代new Buffer
onst buf = Buffer.from("hello world", "utf8");
var str1 = buf.toString("utf-8");
console.log(str1); // hello world
const buf1 = Buffer.from([0x62, 0x75, 0x66, 0x66, 0x65, 0x72]);
var str2 = buf1.toString("utf-8");
console.log(str2); // buffer

Buffer实例buf上的常用属性

buf[index],buf.length

var bin = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
console.log(bin[0]); // 104
console.log(bin.length); // 5

Buffer实例buf上的常用方法

buf.write()

write方法可以向指定的Buffer对象写入数据。它的第一个参数是所写入的内容,第二个参数(可省略)是所写入的起始位置(默认从0开始),第三个参数(可省略)是编码方式,默认为utf8。

var buff1 = new Buffer(40);
buff1.write("dengxi");
buff1.write("age", 20);
buff1.write("18", 30);
console.log(buff1.toString()); // dengxiage18

buf.slice()

slice方法也不是返回一个新的Buffer,如果返回的buffer发生改变,原buffer也会发生改变

var buff2 = new Buffer("just some data");
var chunk = buff2.slice(5, 9);
chunk[0] = 0x65;
console.log(chunk.toString()); // eome
console.log(buff2.toString()); // just eome data

buf.toString()

第一个参数是指定编码,第二个参数是起始位置,第三个参数是终止位置(但不包含终止位置)

var hello = new Buffer("Hello");
hello; // <Buffer 48 65 6c 6c 6f>
hello.toString(); // "Hello" 
var a = hello.toString("ascii", 1, 4);
console.log(a); //ell

buf.toJSON()

转变为JSON字符串

var test = new Buffer("test");
var json = test.toJSON();
console.log(json); // '[116,101,115,116]'
var json1 = test.toJSON(); // { type: 'Buffer', data: [ 116, 101, 115, 116 ] }

buf.copy()

如果想要拷贝一份Buffer数据,得首先创建一个新的Buffer,并通过.copy方法把原Buffer中的数据复制过去

var bin1 = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
var dup1 = new Buffer(bin.length);

bin1.copy(dup1);
dup1[0] = 0x48;
console.log(bin1); // => <Buffer 68 65 6c 6c 6f>
console.log(dup1); // => <Buffer 48 65 65 6c 6f>

buf.compare()

比较的函数语法,比较两个buffer的相对位置,通过返回值的大小(以0为边界),来判断两个buffer的相对位置。

var buffer1 = new Buffer("ABC");
var buffer2 = new Buffer("ABCD");
var result = buffer1.compare(buffer2);
if (result < 0) {
    
    
  console.log(buffer1 + " 在 " + buffer2 + "之前");
} else if (result == 0) {
    
    
  console.log(buffer1 + " 与 " + buffer2 + "相同");
} else {
    
    
  console.log(buffer1 + " 在 " + buffer2 + "之后");
} // ABC 在 ABCD之前

buf.kys() buf.entries() buf.values()

和Object的这三个方法很像

var buffer3 = new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]);
for (const item of buffer3.entries()) {
    
    
  console.log(item);
}
/** 
 * [ 0, 104 ]
[ 1, 101 ]
[ 2, 108 ]
[ 3, 108 ]
[ 4, 111 ]
 * */

for (const item of buffer3.values()) {
    
    
  console.log(item);
}
//   104 101 108 108 111

for (const key of buffer3.keys()) {
    
    
  console.log(key);
}
// 0 1 2 3 4

buf.equals()

检查两个buffer是否有相同。

const a1 = Buffer.from("hello");
const b1 = Buffer.from([0x68, 0x65, 0x6c, 0x6c, 0x6f]);

console.log(a1.equals(b1)); // true

buf.indexOf(value[, byteOffset][, encoding]) 和 buf.lastIndexOf(value[, byteOffset][, encoding])

const c1 = Buffer.from("this is a buffer");
console.log(c1.indexOf("this")); // 0
console.log(c1.indexOf("is")); // 2
console.log(c1.lastIndexOf("is")); // 5
console.log(c1.indexOf("bb")); // -1

buf.includes(value[, byteOffset][, encoding])

const d1 = Buffer.from("this is a buffer");
console.log(d1.includes("this")); // true

buf.fill(value[, offset[, end]][, encoding])

可以对已经创建好的buf进行改造,但需要注意,不能超出buf规定的字节范围,否则会报错

const e1 = Buffer.allocUnsafe(10).fill("h");
console.log(e1.toString()); // hhhhhhhhhh

const f1 = new Buffer(10);
f1.fill("a", 1, 5, "utf8");

console.log(f1.toString()); //aaaa

Buffer类的方法

Buffer.isEncoding()

判断编码方式是否存在

console.log(Buffer.isEncoding("hex")); //true
console.log(Buffer.isEncoding("utf8")) // true
console.log(Buffer.isEncoding("utf81")) // false

Buffer.concat()

连接多个buffer,Buffer.concat方法将一组Buffer对象合并为一个Buffer对象。

var i1 = new Buffer("Hello");
var i2 = new Buffer(" ");
var i3 = new Buffer("World");
var i4 = Buffer.concat([i1, i2, i3]).toString();
console.log(i4); // Hello World

Buffer.byteLength()

计算字节数

Buffer.byteLength("Hello", "utf8"); // 5
var i7 = new Buffer("Hello1")
console.log(Buffer.byteLength(i7))  // 6

Buffer.isBuffer()

判断是否时buffer数据

Buffer.isBuffer(new Date()); // false
Buffer.isBuffer(new Buffer(2)); // true

Buffer.alloc(size[, fill[, encoding]])

分配新的buffer,也可以用来创建新的buffer数据

const g1 = Buffer.alloc(5, "d", "utf8");
console.log(g1); // <Buffer 64 64 64 64 64>

猜你喜欢

转载自blog.csdn.net/glorydx/article/details/129028155