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: 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;
} }

View File

@ -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) {

View File

@ -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');
}); });
}); });

View File

@ -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() {