UNPKG

bigint-buffer

Version:

bigint to buffer conversion with native support

84 lines (76 loc) 2.59 kB
interface ConverterInterface { toBigInt(buf: Buffer, bigEndian?: boolean): bigint; fromBigInt(num: BigInt, buf: Buffer, bigEndian?: boolean): Buffer; } declare var process: {browser: boolean;}; let converter: ConverterInterface; if (!process.browser) { try { converter = require('bindings')('bigint_buffer'); } 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. */ export function toBigIntLE(buf: Buffer): bigint { if (process.browser || 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); } /** * 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. */ export function toBigIntBE(buf: Buffer): bigint { if (process.browser || converter === undefined) { const hex = buf.toString('hex'); if (hex.length === 0) { return BigInt(0); } return BigInt(`0x${hex}`); } return converter.toBigInt(buf, true); } /** * 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. */ export function toBufferLE(num: bigint, width: number): Buffer { if (process.browser || 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); } /** * 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. */ export function toBufferBE(num: bigint, width: number): Buffer { if (process.browser || 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); }