假设我在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));
有更好的方法吗?
另外,我不确定读取是否是正确的单词,但pop会意味着一个数组...使用描述这个函数的功能是什么?
答案 0 :(得分:10)
来自Node.js API:
Buffer类的实例类似于整数数组,但对应于V8堆外部的固定大小的原始内存分配。 缓冲区的大小在创建时建立,无法调整大小。
这就是.pop()
没有Buffer
方法的原因,因为它不是一个固定大小的操作,不像数组。 shift
和splice
也是如此。您无法扩展已分配的Buffer
,但您可以创建新的。{/ p>
使用.slice()
不会给你一个新的Buffer
,而是返回原始Buffer
占用的内存子集。虽然这种方法有效,但某些其他变量仍有可能引用原始Buffer
,在这种情况下,对从.slice()
获得的子集所做的修改可能会延续到原始Buffer
也是。
鉴于Buffer
的性质以及您似乎想要的操作类型,最好先将items
转换为字符串。然后,您可以使用.split('')
执行拆分,执行您提到的所有操作。完成后,您可以加入拆分字符串并使用Buffer
创建新的Buffer.from(string)
并将其分配回items
。这样,您的代码就会更清晰。