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

问题描述 投票:0回答:1

假设我在 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 意味着一个数组......使用什么词来描述这个函数的作用是正确的?

javascript node.js buffer node.js-buffer
1个回答
14
投票

来自 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
。这样,你的代码就会更加清晰。

© www.soinside.com 2019 - 2024. All rights reserved.