buffer
Buffer 代表的都是二进制数据,代表是内存,它不能扩容(java 数组不能扩容,想扩容可以使用动态数组,或者生成一个新的内存拷贝过去)
服务端可以操作二进制,Buffer 可以和字符串进行相互转换
buffer 的三种声明方式
开发中数字都是以字节为单位
1. 通过长度来声明
Buffer.alloc()
方法创建一个指定大小的新缓冲区对象。
// 创建一个 5 字节的缓冲区对象 const buffer = Buffer.alloc(5); console.log(buffer);
2. 根据汉字来转化成 buffer
const buffer = Buffer.from("凯小默"); console.log(buffer);
3. 通过数组来指定存放的内容(不常用)
const buffer = Buffer.from([0xe5, 0x87, 0xaf, 0xe5, 0xb0, 0x8f, 0xe9, 0xbb, 0x98]); console.log(buffer); console.log(buffer.toString());
buffer 的方法
buffer 不具备扩展 push、shift 这些方法
length
可以获取 buffer 字节的长度
const buffer = Buffer.from("凯小默"); // 一个汉字 3 字节 console.log(buffer); console.log(buffer.length); // 9
slice
slice 方法是浅拷贝,buffer 存放的都是内存地址,所有 slice 不会返回一个新的 buffer
const buffer = Buffer.alloc(5); let buf = buffer.slice(0, 1); console.log(buf); buf[0] = 100; console.log(buffer);
这里 100 的 16 进制就是 64。
isBuffer
这个是 Buffer 的静态方法,用于判断是否是 buffer 类型
const buffer = Buffer.from("凯小默"); console.log(Buffer.isBuffer(buffer));
copy(用的少)
缓冲区是一种临时存储器,用于在将数据从一个位置移动到另一位置时存储数据。它就像一个整数数组。
Buffer.copy()
方法只是将所有值从输入缓冲区复制到另一个缓冲区。
copy 参数 (target, targetStart, sourceStart, sourceEnd)
target
:它是一个缓冲区,需要在其中复制所有值。targetStart
:它指的是目标缓冲区的元素将开始写入的起始索引。其默认值为 0。sourceStart
:它是输入缓冲区的索引,将从该索引开始复制值。其默认值为 0。sourceEnd
:输入缓冲区的索引,直到完成值的复制为止。其默认值为buffer.length
const buf1 = Buffer.from("凯小默"); const buf2 = Buffer.from("博客"); // 声明 15 个刚好能放下 const bigBuf = Buffer.alloc(15); console.log("1---->", bigBuf, bigBuf.toString()); buf1.copy(bigBuf, 0, 0, 9); console.log("2---->", bigBuf, bigBuf.toString()); buf2.copy(bigBuf, 9, 0, 6); console.log("3---->", bigBuf, bigBuf.toString());
copy 方法的大致实现
Buffer.prototype.copy = function (target, targetStart, sourceStart, sourceEnd) { console.log("进入--kaimo--copy"); // 将需要 copy 的 source 从 sourceStart 到 sourceEnd 循环遍历 for (let i = sourceStart; i < sourceEnd; i++) { // 从 targetStart 开始,赋值给 target 的每一项 target[targetStart++] = this[i]; } }; const buf1 = Buffer.from("凯小默"); const buf2 = Buffer.from("博客"); // 声明 15 个刚好能放下 const bigBuf = Buffer.alloc(15); console.log("1---->", bigBuf, bigBuf.toString()); buf1.copy(bigBuf, 0, 0, 9); console.log("2---->", bigBuf, bigBuf.toString()); buf2.copy(bigBuf, 9, 0, 6); console.log("3---->", bigBuf, bigBuf.toString());
concat
concat 的原理就是 copy。
concat 有两个参数 concat(list, length)
.
const buf1 = Buffer.from("凯小默"); const buf2 = Buffer.from("博客"); const bigBuf = Buffer.concat([buf1, buf2], 15); console.log(bigBuf, bigBuf.toString());
concat 大致实现原理
const buf1 = Buffer.from("凯小默"); const buf2 = Buffer.from("博客"); Buffer.concat = function (list, length = list.reduce((x, y) => x + y.length, 0)) { console.log(list, length); let buffer = Buffer.alloc(length); let offset = 0; // 偏移量 list.forEach((buf) => { buf.copy(buffer, offset); offset += buf.length; }); return buffer.slice(0, offset); }; const bigBuf = Buffer.concat([buf1, buf2, buf1, buf2]); console.log(bigBuf, bigBuf.toString());