无法通过在node.js中切片来修改数组

时间:2016-02-20 20:48:09

标签: javascript node.js unpack

我有这个外部定义,它包含一个缓冲区和对该缓冲区执行操作的函数。

var Packer = {
    _buffer: new Buffer(""),

    readShort: function(){
        var rs = this._buffer.readInt16BE();
        console.log('first buffer len ' + this._buffer.length);
        this._buffer = this._buffer.slice(2);
        console.log('second buffer len ' + this._buffer.length);
        return rs;
    },

    readString: function(){
        var len = this.readShort();
        console.log('while reading string len is ' + len);
        var rs = this._buffer.toString('utf8', 2, len + 2);
        this._buffer = this._buffer.slice(len + 2);
        return rs;
    },
};

exports.Packer = Packer;

在外部,我打电话给以下人员:

var HelloBob = {
    handlePacket: function(p){
         //.. p is a string
         p = new Buffer(p);

         var packer = Object.spawn(pack.Packer, {_buffer: p});

         //Bob is trying to improve his knowledge
         var humansOnMoon = packer.readShort();
         var nameOfGalaxy = packer.readString();
    },
};

问题是在readShort操作之后缓冲区没有更新(这意味着切片会切掉一部分缓冲区)。

first buffer len 354
second buffer len 354
while reading string len is 354

我读到切片内存后的缓冲区与原始缓冲区共享内存。我还试图复制缓冲区(重叠它)以删除第一个(2)元素,但它的行为相同。

为什么会发生这种情况,我该如何解决?

注意:

  • p是长度为354的缓冲液
  • Docs

1 个答案:

答案 0 :(得分:0)

我设法通过一个函数(而不是通过初始化程序)设置_buffer变量来修复它。不知何故,如果我在{}中设置它,它就好像它是不可变的。

var packer = Object.spawn(pack.Packer, {});
packer.setBuffer(new Buffer(p));

添加了这个setter:

setBuffer: function(nbf){
    this._buffer = nbf;
}