|
|
const bigInt = require("big-integer");
module.exports.leBuff2int = leBuff2int; module.exports.leInt2Buff = leInt2Buff; module.exports.beBuff2int = beBuff2int; module.exports.beInt2Buff = beInt2Buff; module.exports.stringifyBigInts = stringifyBigInts; module.exports.unstringifyBigInts = unstringifyBigInts;
function leBuff2int (buff) { let res = bigInt.zero; for (let i=0; i<buff.length; i++) { const n = bigInt(buff[i]); res = res.add(n.shiftLeft(i*8)); } return res; }
function leInt2Buff(n, len) { let r = n; let o =0; const buff = Buffer.alloc(len); while ((r.gt(bigInt.zero))&&(o<buff.length)) { let c = Number(r.and(bigInt(255))); buff[o] = c; o++; r = r.shiftRight(8); } if (r.gt(bigInt.zero)) throw new Error("Number does not feed in buffer"); return buff; }
function beBuff2int (buff) { let res = bigInt.zero; for (let i=0; i<buff.length; i++) { const n = bigInt(buff[buff.length - i - 1]); res = res.add(n.shiftLeft(i*8)); } return res; }
function beInt2Buff(n, len) { let r = n; let o =len-1; const buff = Buffer.alloc(len); while ((r.greater(bigInt.zero))&&(o>=0)) { let c = Number(r.and(bigInt(255))); buff[o] = c; o--; r = r.shiftRight(8); } if (r.gt(bigInt.zero)) throw new Error("Number does not feed in buffer"); return buff; }
function stringifyBigInts(o) { if ((typeof(o) == "bigint") || o.isZero !== undefined) { return o.toString(10); } else if (Array.isArray(o)) { return o.map(stringifyBigInts); } else if (typeof o == "object") { const res = {}; for (let k in o) { res[k] = stringifyBigInts(o[k]); } return res; } else { return o; } }
function unstringifyBigInts(o) { if ((typeof(o) == "string") && (/^[0-9]+$/.test(o) )) { return bigInt(o); } else if (Array.isArray(o)) { return o.map(unstringifyBigInts); } else if (typeof o == "object") { const res = {}; for (let k in o) { res[k] = unstringifyBigInts(o[k]); } return res; } else { return o; } }
|