UNPKG

@trufflesuite/bigint-buffer

Version:

bigint to buffer conversion with native support

80 lines (78 loc) 2.58 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); const path = require("path"); let converter; { try { // TODO: add arch-specific binaries as necessary converter = require('node-gyp-build')(path.join(__dirname, `../`)); } catch (e) { console.warn('bigint: Failed to load bindings, pure JS will be used (try npm run rebuild?)'); } } /** * Convert a little-endian buffer into a BigInt. * @param buf The little-endian buffer to convert * @returns A BigInt with the little-endian representation of buf. */ function toBigIntLE(buf) { if (converter === undefined) { const reversed = Buffer.from(buf); reversed.reverse(); const hex = reversed.toString('hex'); if (hex.length === 0) { return BigInt(0); } return BigInt(`0x${hex}`); } return converter.toBigInt(buf, false); } exports.toBigIntLE = toBigIntLE; /** * Convert a big-endian buffer into a BigInt * @param buf The big-endian buffer to convert. * @returns A BigInt with the big-endian representation of buf. */ function toBigIntBE(buf) { if (converter === undefined) { const hex = buf.toString('hex'); if (hex.length === 0) { return BigInt(0); } return BigInt(`0x${hex}`); } return converter.toBigInt(buf, true); } exports.toBigIntBE = toBigIntBE; /** * Convert a BigInt to a little-endian buffer. * @param num The BigInt to convert. * @param width The number of bytes that the resulting buffer should be. * @returns A little-endian buffer representation of num. */ function toBufferLE(num, width) { if (converter === undefined) { const hex = num.toString(16); const buffer = Buffer.from(hex.padStart(width * 2, '0').slice(0, width * 2), 'hex'); buffer.reverse(); return buffer; } // Allocation is done here, since it is slower using napi in C return converter.fromBigInt(num, Buffer.allocUnsafe(width), false); } exports.toBufferLE = toBufferLE; /** * Convert a BigInt to a big-endian buffer. * @param num The BigInt to convert. * @param width The number of bytes that the resulting buffer should be. * @returns A big-endian buffer representation of num. */ function toBufferBE(num, width) { if (converter === undefined) { const hex = num.toString(16); return Buffer.from(hex.padStart(width * 2, '0').slice(0, width * 2), 'hex'); } return converter.fromBigInt(num, Buffer.allocUnsafe(width), true); } exports.toBufferBE = toBufferBE;