我有这个外部定义,它包含一个缓冲区和对该缓冲区执行操作的函数。
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)元素,但它的行为相同。
为什么会发生这种情况,我该如何解决?
注意:
答案 0 :(得分:0)
我设法通过一个函数(而不是通过初始化程序)设置_buffer变量来修复它。不知何故,如果我在{}中设置它,它就好像它是不可变的。
var packer = Object.spawn(pack.Packer, {});
packer.setBuffer(new Buffer(p));
添加了这个setter:
setBuffer: function(nbf){
this._buffer = nbf;
}