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) {
var sum = 0;
for (var i=0; i<bytes; i++) {
sum += (so.read(1)[0] << (8 * (bytes - i - 1)));
if (bytes > 4) {
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({
@@ -171,7 +177,7 @@ STInt16.id = 1;
var STInt32 = exports.Int32 = new SerializedType({
serialize: function (so, val) {
append_byte_array(so, val, 4)
append_byte_array(so, val, 4);
},
parse: function (so) {
return readAndSum(so, 4);

View File

@@ -204,6 +204,24 @@ describe('Serialized types', function() {
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() {
@@ -333,11 +351,29 @@ describe('Serialized types', function() {
types.Hash128.serialize(so, '102030405060708090A0B0C0D0E0F000');
assert.strictEqual(so.to_hex(), '102030405060708090A0B0C0D0E0F000');
});
it('Serialize FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', function () {
it('Serialize HASH128_MAX', function () {
var so = new SerializedObject();
types.Hash128.serialize(so, '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() {
@@ -356,6 +392,24 @@ describe('Serialized types', function() {
types.Hash160.serialize(so, 'rQLbzfJH5BT1FS9apRLKV3G8dWEA5njaQi');
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() {