handle varInts better
This commit is contained in:
parent
4cff6a41f4
commit
ddc9e2d2a4
|
@ -70,7 +70,7 @@ BufferReader.prototype.readVarInt = function() {
|
||||||
case 0xFE:
|
case 0xFE:
|
||||||
return this.readUInt32LE();
|
return this.readUInt32LE();
|
||||||
case 0xFF:
|
case 0xFF:
|
||||||
return this.readUInt64LEBN().toNumber();
|
throw new Error('number too large to retain precision - use readVarIntBN');
|
||||||
default:
|
default:
|
||||||
return first;
|
return first;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,6 @@ BufferWriter.prototype.writeUInt64BEBN = function(bn) {
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
//TODO: What if n is so large that it loses precision?
|
|
||||||
BufferWriter.prototype.writeUInt64LEBN = function(bn) {
|
BufferWriter.prototype.writeUInt64LEBN = function(bn) {
|
||||||
var buf = bn.toBuffer({size: 8});
|
var buf = bn.toBuffer({size: 8});
|
||||||
var reversebuf = new Buffer(Array.apply(new Array(), buf).reverse());
|
var reversebuf = new Buffer(Array.apply(new Array(), buf).reverse());
|
||||||
|
@ -76,7 +75,6 @@ BufferWriter.prototype.writeVarIntBN = function(bn) {
|
||||||
return this;
|
return this;
|
||||||
};
|
};
|
||||||
|
|
||||||
//TODO: What if n is so large that it loses precision?
|
|
||||||
BufferWriter.varIntBuf = function(n) {
|
BufferWriter.varIntBuf = function(n) {
|
||||||
var buf = undefined;
|
var buf = undefined;
|
||||||
if (n < 253) {
|
if (n < 253) {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
var BufferWriter = require('../lib/bufferwriter');
|
||||||
var BufferReader = require('../lib/bufferreader');
|
var BufferReader = require('../lib/bufferreader');
|
||||||
var should = require('chai').should();
|
var should = require('chai').should();
|
||||||
|
|
||||||
|
@ -156,10 +157,12 @@ describe('BufferReader', function() {
|
||||||
br.readVarInt().should.equal(50000);
|
br.readVarInt().should.equal(50000);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should read a 9 byte varint', function() {
|
it('should throw an error on a 9 byte varint', function() {
|
||||||
var buf = Buffer.concat([new Buffer([255]), new Buffer('ffffffffffffffff', 'hex')]);
|
var buf = Buffer.concat([new Buffer([255]), new Buffer('ffffffffffffffff', 'hex')]);
|
||||||
var br = new BufferReader(buf);
|
var br = new BufferReader(buf);
|
||||||
br.readVarInt().should.equal(Math.pow(2, 64));
|
(function() {
|
||||||
|
br.readVarInt();
|
||||||
|
}).should.throw('number too large to retain precision - use readVarIntBN');
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
var BufferWriter = require('../lib/bufferwriter');
|
var BufferWriter = require('../lib/bufferwriter');
|
||||||
|
var BufferReader = require('../lib/bufferreader');
|
||||||
var BN = require('../lib/bn');
|
var BN = require('../lib/bn');
|
||||||
var should = require('chai').should();
|
var should = require('chai').should();
|
||||||
|
|
||||||
|
@ -120,6 +121,15 @@ describe('BufferWriter', function() {
|
||||||
bw.concat().length.should.equal(9);
|
bw.concat().length.should.equal(9);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should read back the same value it wrote for a 9 byte varInt', function() {
|
||||||
|
var bw = new BufferWriter();
|
||||||
|
var n = Math.pow(2, 53);
|
||||||
|
n.should.equal(n + 1); //javascript number precision limit
|
||||||
|
bw.writeVarInt(n);
|
||||||
|
var br = new BufferReader(bw.concat());
|
||||||
|
br.readVarIntBN().toNumber().should.equal(n);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('#writeVarIntBN', function() {
|
describe('#writeVarIntBN', function() {
|
||||||
|
|
Loading…
Reference in New Issue