add bn2.js.
This commit is contained in:
parent
0ba31eeb59
commit
05a8aeeb48
98
lib/bcoin/bn.js
Normal file
98
lib/bcoin/bn.js
Normal file
@ -0,0 +1,98 @@
|
||||
/**
|
||||
* bn.js - signed big numbers for bcoin
|
||||
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
|
||||
* https://github.com/indutny/bcoin
|
||||
*/
|
||||
|
||||
var bn = require('bn.js');
|
||||
|
||||
/**
|
||||
* Signed Big Numbers
|
||||
*/
|
||||
|
||||
function bn2(number, signed, base, endian) {
|
||||
if (!(this instanceof bn2))
|
||||
return new bn2(number, signed, base, endian);
|
||||
|
||||
if (typeof signed !== 'boolean') {
|
||||
endian = base;
|
||||
base = signed;
|
||||
signed = null;
|
||||
}
|
||||
|
||||
this.__signed = !!signed;
|
||||
|
||||
return bn.call(this, number, base, endian);
|
||||
}
|
||||
|
||||
bn2.prototype.__proto__ = bn.prototype;
|
||||
|
||||
bn2.prototype._initArray = function _initArray(number, base, endian) {
|
||||
var i = 0;
|
||||
var ret;
|
||||
|
||||
if (!this.__signed)
|
||||
return bn.prototype._initArray.apply(this, arguments);
|
||||
|
||||
if (endian === 'le')
|
||||
i = number.length - 1;
|
||||
|
||||
// If we are signed, do (~num + 1) to get
|
||||
// the positive counterpart and set bn's
|
||||
// negative flag.
|
||||
if (number[i] & 0x80) {
|
||||
if (isNegZero(number, endian)) {
|
||||
ret = this._initNumber(0, 10, endian);
|
||||
} else {
|
||||
ret = bn.prototype._initArray.apply(this, arguments);
|
||||
this.inotn(64).iaddn(1).ineg();
|
||||
}
|
||||
} else {
|
||||
ret = bn.prototype._initArray.apply(this, arguments);
|
||||
}
|
||||
|
||||
return ret;
|
||||
};
|
||||
|
||||
bn2.prototype.toArray = function toArray(endian, length) {
|
||||
var self = this;
|
||||
|
||||
if (!this.__signed)
|
||||
return bn.prototype.toArray.apply(self, arguments);
|
||||
|
||||
// Convert the number to the
|
||||
// negative byte representation.
|
||||
if (self.isNeg()) {
|
||||
if (self.cmpn(0) === 0)
|
||||
self = new bn(0);
|
||||
else
|
||||
self = self.neg().notn(64).addn(1);
|
||||
}
|
||||
|
||||
return bn.prototype.toArray.apply(self, arguments);
|
||||
};
|
||||
|
||||
bn2.signed = function signed(number, base, endian) {
|
||||
return new bn2(number, true, base, endian);
|
||||
};
|
||||
|
||||
function isNegZero(number, endian) {
|
||||
var i = 0;
|
||||
|
||||
if (endian === 'le')
|
||||
i = number.length - 1;
|
||||
|
||||
if (number[i] & 0x80) {
|
||||
number = number.slice();
|
||||
number[i] &= ~0x80;
|
||||
return new bn(number, endian).cmpn(0) === 0;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Expose
|
||||
*/
|
||||
|
||||
module.exports = bn2;
|
||||
Loading…
Reference in New Issue
Block a user