从缓冲区中删除多个字节的规范方法

时间:2017-01-16 01:58:49

标签: javascript node.js buffer node.js-buffer

假设我在Node.js中有一个简单的缓冲区,如下所示:

const bytes = Buffer.from('abcdefg');

这个缓冲区实例有sliceconcat作为方法,但我真的不确定如何使用它们来基本上创建数组的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会意味着一个数组...使用描述这个函数的功能是什么?

1 个答案:

答案 0 :(得分:10)

来自Node.js API

  

Buffer类的实例类似于整数数组,但对应于V8堆外部的固定大小的原始内存分配。 缓冲区的大小在创建时建立,无法调整大小。

这就是.pop()没有Buffer方法的原因,因为它不是一个固定大小的操作,不像数组。 shiftsplice也是如此。您无法扩展已分配的Buffer,但您可以创建新的。{/ p>

使用.slice()不会给你一个新的Buffer,而是返回原始Buffer占用的内存子集。虽然这种方法有效,但某些其他变量仍有可能引用原始Buffer,在这种情况下,对从.slice()获得的子集所做的修改可能会延续到原始Buffer也是。

鉴于Buffer的性质以及您似乎想要的操作类型,最好先将items转换为字符串。然后,您可以使用.split('')执行拆分,执行您提到的所有操作。完成后,您可以加入拆分字符串并使用Buffer创建新的Buffer.from(string)并将其分配回items。这样,您的代码就会更清晰。

相关问题