Node.js中的缓冲区问题

Buffer issue in Node.js

本文关键字:缓冲区 问题 js Node      更新时间:2023-09-26

在Node.js中使用缓冲区时,我有一个小问题

我已经像这样定义了我的常量缓冲区。

var commands = {
    BufferOne : new Buffer([0XCA, 0X11, 0X00, 0X00, 0X60, 0X01, 
              0X00, 0X01, 0X08, 0X07, 0X6D, 0X00, 0X00, 0X00,
              0X00, 0X00, 0X4F, 0X41, 0X30, 0X30, 0X00])
}

现在以后当我在程序中收到任何特定的事件时,我想要从中更新14,15。

比如说在其中一个函数中我将创建一个局部变量

var bufferCopy = commands.BufferOne;
bufferCopy[14] = "0X02";
bufferCopy[15] = "0X00";

然后我想使用bufferCopy发送到串行端口,但我的功能不起作用。

和上面一样如果我这样做

var bufferCopy = new Buffer([0XCA, 0X11, 0X00, 0X00, 0X60, 0X01, 0X00,
   0X01, 0X08, 0X07, 0X6D, 0X00, 0X00, 0X00, 0X00, 0X00, 0X4F, 0X41,
   0X30, 0X30, 0X00]);
bufferCopy[14] = "0X02";
bufferCopy[15] = "0X00";

那么它工作得很好。我可以在串行端口上得到结果。

所以我不明白为什么我不能从上面声明的常量中创建任何局部变量。

我想使用常量的原因是,因为我想把所有的常量移动到一些服务器,这样我就可以从服务器发送这些命令,而不是保持在节点程序本身。

当你分配一个Buffer (var bufferCopy = commands.BufferOne;),它创建一个引用(就像JavaScript中的所有对象分配)到原始缓冲区,所以你实际上是修改commands.BufferOne而不是commands.BufferOne的副本。

如果你想要一个副本,你必须显式地创建一个副本,如:

var bufferCopy = new Buffer(commands.BufferOne);
bufferCopy[14] = "0X02";
bufferCopy[15] = "0X00";

则只修改bufferCopy,不修改commands.BufferOne