You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.4 KiB
101 lines
2.4 KiB
var BN = require('./bn');
|
|
|
|
var BufferReader = function BufferReader(buf, pos) {
|
|
if (!(this instanceof BufferReader))
|
|
return new BufferReader(buf);
|
|
this.buf = buf;
|
|
this.pos = pos || 0;
|
|
};
|
|
|
|
BufferReader.prototype.eof = function eof() {
|
|
return this.pos >= this.buf.length;
|
|
};
|
|
|
|
BufferReader.prototype.read = function() {
|
|
var buf = this.buf.slice(this.pos);
|
|
this.pos = this.buf.length;
|
|
return buf;
|
|
};
|
|
|
|
BufferReader.prototype.readUInt8 = function() {
|
|
var val = this.buf.readUInt8(this.pos);
|
|
this.pos = this.pos + 1;
|
|
return val;
|
|
};
|
|
|
|
BufferReader.prototype.readUInt16BE = function() {
|
|
var val = this.buf.readUInt16BE(this.pos);
|
|
this.pos = this.pos + 2;
|
|
return val;
|
|
};
|
|
|
|
BufferReader.prototype.readUInt16LE = function() {
|
|
var val = this.buf.readUInt16LE(this.pos);
|
|
this.pos = this.pos + 2;
|
|
return val;
|
|
};
|
|
|
|
BufferReader.prototype.readUInt32BE = function() {
|
|
var val = this.buf.readUInt32BE(this.pos);
|
|
this.pos = this.pos + 4;
|
|
return val;
|
|
};
|
|
|
|
BufferReader.prototype.readUInt32LE = function() {
|
|
var val = this.buf.readUInt32LE(this.pos);
|
|
this.pos = this.pos + 4;
|
|
return val;
|
|
};
|
|
|
|
BufferReader.prototype.readUInt64BEBN = function() {
|
|
var buf = this.buf.slice(this.pos, this.pos + 8);
|
|
var bn = BN().fromBuffer(buf);
|
|
this.pos = this.pos + 8;
|
|
return bn;
|
|
};
|
|
|
|
BufferReader.prototype.readUInt64LEBN = function() {
|
|
var buf = this.buf.slice(this.pos, this.pos + 8);
|
|
var reversebuf = BufferReader(buf).reverse().read();
|
|
var bn = BN().fromBuffer(reversebuf);
|
|
this.pos = this.pos + 8;
|
|
return bn;
|
|
};
|
|
|
|
BufferReader.prototype.readVarInt = function() {
|
|
var first = this.readUInt8();
|
|
switch (first) {
|
|
case 0xFD:
|
|
return this.readUInt16LE();
|
|
case 0xFE:
|
|
return this.readUInt32LE();
|
|
case 0xFF:
|
|
throw new Error('number too large to retain precision - use readVarIntBN');
|
|
default:
|
|
return first;
|
|
}
|
|
};
|
|
|
|
BufferReader.prototype.readVarIntBN = function() {
|
|
var first = this.readUInt8();
|
|
switch (first) {
|
|
case 0xFD:
|
|
return BN(this.readUInt16LE());
|
|
case 0xFE:
|
|
return BN(this.readUInt32LE());
|
|
case 0xFF:
|
|
return this.readUInt64LEBN();
|
|
default:
|
|
return BN(first);
|
|
}
|
|
};
|
|
|
|
BufferReader.prototype.reverse = function() {
|
|
var buf = new Buffer(this.buf.length);
|
|
for (var i = 0; i < buf.length; i++)
|
|
buf[i] = this.buf[this.buf.length - 1 - i]
|
|
this.buf = buf;
|
|
return this;
|
|
};
|
|
|
|
module.exports = BufferReader;
|
|
|