UNPKG

elflib

Version:
56 lines (55 loc) 2.06 kB
/** cross-environment utf-8 decode */ let _decode; export function decode(array, offset, length) { if (_decode) { return _decode(array, offset, length); } else { throw new Error('There is no supported utf-8 decoder'); } } if (typeof require !== undefined) { let decoder; try { const { StringDecoder } = require('string_decoder'); const decoder = new StringDecoder('utf8'); if (decoder) { _decode = (array, offset, length) => { return decoder.end(array.subarray(offset, offset + length)); }; } } catch (e) { } } if (_decode === undefined && typeof TextDecoder !== 'undefined') { const decoder = new TextDecoder(); _decode = (array, offset, length) => { return decoder.decode(array.subarray(offset, offset + length)); }; } function toHexSInt(bits, number) { if (number < 0) number = ((0x100 ** (bits / 8)) - 1) + number + 1; return number.toString(16).toUpperCase(); } export function encode(input, bytesAlign = 0, signed = false, encoding = 'utf-8') { if (typeof input === 'string') return encodeString(input, encoding); if (typeof input === 'number') return encodeNumber(Math.floor(input), Math.floor(bytesAlign), signed); throw new Error('Unexpected input type "' + typeof input + '".'); } function encodeString(string, encoding = 'utf-8') { return Buffer.from(string, encoding); } function encodeNumber(number, bytesAlign = 0, signed = false) { if (!signed) number = Math.abs(number); const tmpstr = signed ? toHexSInt((bytesAlign * 8) || 8, number) : number.toString(16); return Buffer.from(tmpstr.padStart(tmpstr.length + Number(tmpstr.length % 2 !== 0), '0').padStart(bytesAlign * 2, '0'), 'hex'); } export function trimBuffer(buf, offset = 0, length = buf.byteLength) { if (buf instanceof ArrayBuffer) return buf.slice(offset, offset + length); return buf.buffer.slice(buf.byteOffset + offset, buf.byteOffset + offset + length); }