elflib
Version:
ELF file reader and writer
56 lines (55 loc) • 2.06 kB
JavaScript
/** 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);
}