Fix large 32-bit integers getting deserialized as signed ints.

This commit is contained in:
Stefan Thomas
2013-11-08 14:13:54 -08:00
parent 5b1b41ae80
commit a8759f1390
2 changed files with 65 additions and 5 deletions

View File

@@ -140,11 +140,17 @@ function append_byte_array(so, val, bytes) {
function readAndSum(so, bytes) { function readAndSum(so, bytes) {
var sum = 0; var sum = 0;
for (var i=0; i<bytes; i++) { if (bytes > 4) {
sum += (so.read(1)[0] << (8 * (bytes - i - 1))); throw new Error("This function only supports up to four bytes.");
} }
return sum; for (var i=0; i<bytes; i++) {
var byte = so.read(1)[0];
sum += (byte << (8 * (bytes - i - 1)));
}
// Convert to unsigned integer
return sum >>> 0;
}; };
var STInt8 = exports.Int8 = new SerializedType({ var STInt8 = exports.Int8 = new SerializedType({
@@ -171,7 +177,7 @@ STInt16.id = 1;
var STInt32 = exports.Int32 = new SerializedType({ var STInt32 = exports.Int32 = new SerializedType({
serialize: function (so, val) { serialize: function (so, val) {
append_byte_array(so, val, 4) append_byte_array(so, val, 4);
}, },
parse: function (so) { parse: function (so) {
return readAndSum(so, 4); return readAndSum(so, 4);

View File

@@ -204,6 +204,24 @@ describe('Serialized types', function() {
types.Int32.serialize(so, {}); types.Int32.serialize(so, {});
}); });
}); });
it('Parse 0', function () {
var val = '00000000';
var so = new SerializedObject(val);
var num = types.Int32.parse(so);
assert.strictEqual(num, parseInt(val, 16));
});
it('Parse 1', function () {
var val = '00000001';
var so = new SerializedObject(val);
var num = types.Int32.parse(so);
assert.strictEqual(num, parseInt(val, 16));
});
it('Parse UINT32_MAX', function () {
var val = 'FFFFFFFF';
var so = new SerializedObject(val);
var num = types.Int32.parse(so);
assert.strictEqual(num, parseInt(val, 16));
});
}); });
describe('Int64', function() { describe('Int64', function() {
@@ -333,11 +351,29 @@ describe('Serialized types', function() {
types.Hash128.serialize(so, '102030405060708090A0B0C0D0E0F000'); types.Hash128.serialize(so, '102030405060708090A0B0C0D0E0F000');
assert.strictEqual(so.to_hex(), '102030405060708090A0B0C0D0E0F000'); assert.strictEqual(so.to_hex(), '102030405060708090A0B0C0D0E0F000');
}); });
it('Serialize FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', function () { it('Serialize HASH128_MAX', function () {
var so = new SerializedObject(); var so = new SerializedObject();
types.Hash128.serialize(so, 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'); types.Hash128.serialize(so, 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF');
assert.strictEqual(so.to_hex(), 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'); assert.strictEqual(so.to_hex(), 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF');
}); });
it('Parse 0', function () {
var val = '00000000000000000000000000000000';
var so = new SerializedObject(val);
var num = types.Hash128.parse(so);
assert.strictEqual(num.to_hex(), val);
});
it('Parse 1', function () {
var val = '00000000000000000000000000000001';
var so = new SerializedObject(val);
var num = types.Hash128.parse(so);
assert.strictEqual(num.to_hex(), val);
});
it('Parse HASH128_MAX', function () {
var val = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
var so = new SerializedObject(val);
var num = types.Hash128.parse(so);
assert.strictEqual(num.to_hex(), val);
});
}); });
describe('Hash160', function() { describe('Hash160', function() {
@@ -356,6 +392,24 @@ describe('Serialized types', function() {
types.Hash160.serialize(so, 'rQLbzfJH5BT1FS9apRLKV3G8dWEA5njaQi'); types.Hash160.serialize(so, 'rQLbzfJH5BT1FS9apRLKV3G8dWEA5njaQi');
assert.strictEqual(so.to_hex(), 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF'); assert.strictEqual(so.to_hex(), 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF');
}); });
it('Parse 0', function () {
var val = '0000000000000000000000000000000000000000';
var so = new SerializedObject(val);
var num = types.Hash160.parse(so);
assert.strictEqual(num.to_hex(), val);
});
it('Parse 1', function () {
var val = '0000000000000000000000000000000000000001';
var so = new SerializedObject(val);
var num = types.Hash160.parse(so);
assert.strictEqual(num.to_hex(), val);
});
it('Parse HASH160_MAX', function () {
var val = 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF';
var so = new SerializedObject(val);
var num = types.Hash160.parse(so);
assert.strictEqual(num.to_hex(), val);
});
}); });
describe('Hash256', function() { describe('Hash256', function() {