Node.js buffer.copy()api看起来很奇怪,与C中的memcpy不太相似

时间:2012-01-10 14:26:09

标签: node.js

我对缓冲区索引含义中node.js中的Buffer.copy api感到困惑。我原以为它与C / Unix中的memcpy相似,但似乎并非如此

根据API文档和http://nodejs.org/docs/latest/api/buffers.html#buffer.copy

中提供的示例
buffer.copy(targetBuffer, [targetStart], [sourceStart], [sourceEnd]) 

表示targetStart不是targetBuffer的索引,索引从0开始,与sourceStart的情况相同。相反,索引似乎从1开始而不是0.最令人困惑的是sourceEnd。从示例看起来像复制sourceEnd字节之前的字节,然后如何复制最后一个字节

node.js doc中的示例是 示例:构建两个缓冲区,然后将buf1从字节16到字节19复制到buf2,从buf2中的第8个字节开始。 为此,声明是

buf1 = new Buffer(26);
buf2 = new Buffer(26);
buf1.copy(buf2, 8, 16, 20);

如果我想复制到第26个字节,我需要将27指定为sourceEnd吗?看起来非常奇怪,我需要提供一个大于源缓冲区长度的值

有人可以提供一个明确的解释,说明为什么node.js选择了这种行为而不是类似于memcpy?

2 个答案:

答案 0 :(得分:2)

选择这些(可能令人困惑的)索引约定的原因可能与核心JavaScript函数(例如String.slice)设置的先例有关。

请记住,node.js基于JavaScript,而不是C / POSIX =)

答案 1 :(得分:0)

Buffer的索引为zero-based,因为可以在文档中提供的示例中看到。

由于buf1的长度设置为26,因此其“有效”索引为0,1,2,...,25,因此第26个字节的索引为25。

最后,您需要提供26作为sourceEnd参数值。