61 lines
2.1 KiB
Plaintext
61 lines
2.1 KiB
Plaintext
const decoder = new TextDecoder();
|
|
const toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end));
|
|
const toHexString = (input, start = 0, end = input.length) => input.slice(start, end).reduce((memo, i) => memo + ("0" + i.toString(16)).slice(-2), "");
|
|
const readInt16LE = (input, offset = 0) => {
|
|
const val = input[offset] + input[offset + 1] * 2 ** 8;
|
|
return val | (val & 2 ** 15) * 131070;
|
|
};
|
|
const readUInt16BE = (input, offset = 0) => input[offset] * 2 ** 8 + input[offset + 1];
|
|
const readUInt16LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8;
|
|
const readUInt24LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16;
|
|
const readInt32LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16 + (input[offset + 3] << 24);
|
|
const readUInt32BE = (input, offset = 0) => input[offset] * 2 ** 24 + input[offset + 1] * 2 ** 16 + input[offset + 2] * 2 ** 8 + input[offset + 3];
|
|
const readUInt32LE = (input, offset = 0) => input[offset] + input[offset + 1] * 2 ** 8 + input[offset + 2] * 2 ** 16 + input[offset + 3] * 2 ** 24;
|
|
const methods = {
|
|
readUInt16BE,
|
|
readUInt16LE,
|
|
readUInt32BE,
|
|
readUInt32LE
|
|
};
|
|
function readUInt(input, bits, offset, isBigEndian) {
|
|
offset = offset || 0;
|
|
const endian = isBigEndian ? "BE" : "LE";
|
|
const methodName = "readUInt" + bits + endian;
|
|
return methods[methodName](input, offset);
|
|
}
|
|
function readBox(buffer, offset) {
|
|
if (buffer.length - offset < 4)
|
|
return;
|
|
const boxSize = readUInt32BE(buffer, offset);
|
|
if (buffer.length - offset < boxSize)
|
|
return;
|
|
return {
|
|
name: toUTF8String(buffer, 4 + offset, 8 + offset),
|
|
offset,
|
|
size: boxSize
|
|
};
|
|
}
|
|
function findBox(buffer, boxName, offset) {
|
|
while (offset < buffer.length) {
|
|
const box = readBox(buffer, offset);
|
|
if (!box)
|
|
break;
|
|
if (box.name === boxName)
|
|
return box;
|
|
offset += box.size;
|
|
}
|
|
}
|
|
export {
|
|
findBox,
|
|
readInt16LE,
|
|
readInt32LE,
|
|
readUInt,
|
|
readUInt16BE,
|
|
readUInt16LE,
|
|
readUInt24LE,
|
|
readUInt32BE,
|
|
readUInt32LE,
|
|
toHexString,
|
|
toUTF8String
|
|
};
|