mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-20 20:25:48 +00:00
Fix large 32-bit integers getting deserialized as signed ints.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user