假设我在 Node.js 中有一个简单的缓冲区,如下所示:
const bytes = Buffer.from('abcdefg');
这个缓冲区实例有
slice
和 concat
作为方法,但我真的不确定如何使用它们来基本上创建数组的 pop/shift/splice 功能。
这里是缓冲区文档:https://nodejs.org/api/buffer.html
我基本上想做的是读取/删除前 X 个字节,如下所示:
function read(x){
// return the first x number of bytes from buffer
// and remove those bytes from the buffer
// side-effects be damned for the moment
}
这是我所拥有的,但对我来说似乎相当“错误”,尽管它似乎也有效:
let items = Buffer.from('abcdefg');
function read(x){
const b = items.slice(0,x);
items = items.slice(x,items.length);
return b;
}
console.log(String(read(4)));
console.log(String(items));
有更好的方法吗?
另外,我不确定 read 是否是正确的词,但 pop 意味着一个数组......使用什么词来描述这个函数的作用是正确的?
来自 Node.js v10.x API 文档(由我加粗):
Buffer 类的实例类似于整数数组,但对应于 V8 堆外部的固定大小的原始内存分配。 Buffer的大小在创建时就确定了,不能调整大小。
这就是为什么
.pop()
没有 Buffer
方法的原因,因为它不是针对本质上与数组不同的固定大小的东西的操作。 shift
和 splice
也是如此。您无法扩展已分配的 Buffer
,但可以创建新的。
使用
.slice()
不会给你一个新的 Buffer
,而是返回原始 Buffer
占用的内存子集。虽然这种方法有效,但其他一些变量可能仍然引用原始 Buffer
,在这种情况下,对从 .slice()
获得的子集所做的修改也可能会延续到原始 Buffer
。
考虑到
Buffer
的性质以及您似乎想要的操作类型,最好首先将 items
转换为字符串。然后,您可以通过使用 .split('')
进行拆分来执行您提到的所有操作。完成后,您可以连接分割字符串并使用 Buffer
创建新的 Buffer.from(string)
并将其分配回 items
。这样,你的代码就会更加清晰。