handle varInts better

This commit is contained in:
Ryan X. Charles 2014-08-21 11:47:09 -07:00
parent 4cff6a41f4
commit ddc9e2d2a4
4 changed files with 16 additions and 5 deletions

View File

@ -70,7 +70,7 @@ BufferReader.prototype.readVarInt = function() {
case 0xFE:
return this.readUInt32LE();
case 0xFF:
return this.readUInt64LEBN().toNumber();
throw new Error('number too large to retain precision - use readVarIntBN');
default:
return first;
}

View File

@ -56,7 +56,6 @@ BufferWriter.prototype.writeUInt64BEBN = function(bn) {
return this;
};
//TODO: What if n is so large that it loses precision?
BufferWriter.prototype.writeUInt64LEBN = function(bn) {
var buf = bn.toBuffer({size: 8});
var reversebuf = new Buffer(Array.apply(new Array(), buf).reverse());
@ -76,7 +75,6 @@ BufferWriter.prototype.writeVarIntBN = function(bn) {
return this;
};
//TODO: What if n is so large that it loses precision?
BufferWriter.varIntBuf = function(n) {
var buf = undefined;
if (n < 253) {

View File

@ -1,3 +1,4 @@
var BufferWriter = require('../lib/bufferwriter');
var BufferReader = require('../lib/bufferreader');
var should = require('chai').should();
@ -156,10 +157,12 @@ describe('BufferReader', function() {
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 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');
});
});

View File

@ -1,4 +1,5 @@
var BufferWriter = require('../lib/bufferwriter');
var BufferReader = require('../lib/bufferreader');
var BN = require('../lib/bn');
var should = require('chai').should();
@ -120,6 +121,15 @@ describe('BufferWriter', function() {
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() {