mirror of
https://github.com/Xahau/xahau.js.git
synced 2025-11-20 12:15:51 +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) {
|
||||
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);
|
||||
|
||||
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user