Kev*_*rke 5 javascript buffer node.js
假设我要在Node中构造一个可变长度的字符串或一系列字节。buf.write的文档说:
https://nodejs.org/api/buffer.html#buffer_buf_write_string_offset_length_encoding
根据编码中的字符编码,将字符串以偏移量写入buf。length参数是要写入的字节数。如果buf没有足够的空间来容纳整个字符串,则仅写入一部分字符串。但是,不会写入部分编码的字符。
假设我要写入的数据超出了缓冲区的空间。推荐的生长方式是什么?似乎没有.grow方法或类似方法。我可以打电话Buffer.from(buf)来创建一个新的缓冲区,但这似乎效率很低。
如果您在每次添加后不需要整个缓冲区的所有内容,我认为您可以在此处使用一组块(缓冲区)并Buffer.concat(chunks)在必要时构建整个缓冲区。
const chunks = [];
chunks.push(Buffer.from([0xE2, 0xAD, 0x90])); // star
chunks.push(Buffer.from([0xF0, 0x9F, 0x9A, 0x80])); // rocket
const buf = Buffer.concat(chunks);
console.log(buf.toString());
Run Code Online (Sandbox Code Playgroud)
当一开始不知道最终大小时,您可以使用通常应用于动态数组的方法:
Buffer一些初始大小Buffer只要有空间就写入内容Buffer双倍大小的新内容,将旧缓冲区的内容复制到新缓冲区,并将新内容像以前一样写到最后这样在缓冲区末尾插入可以在O(1)分摊时间内执行。
这种方法的变体通常用于Java、.NET 或例如MemoryStream对应于 nodejs 的.NET 中的可调整大小的列表Buffer。您可以在此处查看MemoryStream是如何实现的。
尺寸不一定要翻倍。您可以选择不同的指数,例如3/2,如果您想节省一些空间。
当然,最好的方法是什么取决于您的用例,但这种方法总体上表现良好。