【发布时间】:2016-02-20 20:48:09
【问题描述】:
我有这个外部定义,它封装了一个缓冲区和对该缓冲区执行操作的函数。
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
【问题讨论】:
-
切片数组的代码应该可以正常工作,还有其他事情吗?您可能两次都访问同一个数组,要么是因为它还没有改变,要么是因为你做错了什么。需要注意的是,你返回的不是修改后的缓冲区,而是
readInt16BE()的结果? -
@adeneo 实际上,我正在返回从缓冲区读取的值。目的是在同一个缓冲区上再次调用读取,但读取以下值不同的值(这就是我对缓冲区进行切片的原因)
-
我认为你必须发布你如何调用函数,以及
Object.spawn做了什么等。 -
@adeneo 即使 readShort 函数中的两个日志之间,length 的值也不会发生变化。
-
您是否尝试在缓冲区上调用
toString以查看是否发生变化,这可能是记录实时“对象”(缓冲区)的问题
标签: javascript node.js unpack