biguintbe
Version:
Encode / decode unsigned BigInt as big endian
60 lines (44 loc) • 1.62 kB
JavaScript
var assert = require('nanoassert')
var ZERO = 0n
var EIGHT = 8n
var BYTE = 0xffn
function ilog256(bu) {
for (var ilog = 0; bu > ZERO; ilog++) bu >>= EIGHT
return ilog
}
exports.encodingLength = function encodingLength (bu) {
assert(typeof bu === 'bigint', 'bu must be unsigned BigInt')
assert(bu >= ZERO, 'bu must be unsigned')
return ilog256(bu)
}
exports.encode = function encode (bu, buf, byteOffset) {
assert(typeof bu === 'bigint')
var len = exports.encodingLength(bu)
if (!buf) buf = Buffer.alloc(len)
if (!byteOffset) byteOffset = 0
assert(typeof bu === 'bigint', 'bu must be unsigned BigInt')
assert(bu >= 0n, 'bu must be unsigned')
assert(buf.buffer, 'buf must be Buffer or TypedArray')
assert(buf.byteLength - byteOffset >= len, 'buf must be large enough to contain bu (' + len + ' bytes)')
exports.encode.bytes = 0
var alias = new Uint8Array(buf.buffer, buf.byteOffset + byteOffset, buf.byteLength)
for (var i = alias.length - 1; bu > ZERO && i >= 0; i--, bu >>= EIGHT) {
alias[i] = Number(bu & BYTE)
exports.encode.bytes++
}
return buf
}
exports.encode.bytes = 0
exports.decode = function decode (buf, byteOffset, byteLength) {
if (!byteOffset) byteOffset = 0
if (!byteLength) byteLength = buf.byteLength
assert(buf.buffer)
// Defer valdidation of byteOffset and byteLength to constructor
var alias = new Uint8Array(buf.buffer, buf.byteOffset + byteOffset, byteLength)
for (var i = 0, bu = 0n; i < alias.length; i++) {
bu = bu << EIGHT | BigInt(alias[i])
}
exports.decode.bytes = byteLength
return bu
}
exports.decode.bytes = 0