45 lines
1.6 KiB
JavaScript
45 lines
1.6 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.BitReader = void 0;
|
|
/** This class helps read Uint8Array bit-by-bit */
|
|
class BitReader {
|
|
constructor(input, endianness) {
|
|
this.input = input;
|
|
this.endianness = endianness;
|
|
// Skip the first 16 bits (2 bytes) of signature
|
|
this.byteOffset = 2;
|
|
this.bitOffset = 0;
|
|
}
|
|
/** Reads a specified number of bits, and move the offset */
|
|
getBits(length = 1) {
|
|
let result = 0;
|
|
let bitsRead = 0;
|
|
while (bitsRead < length) {
|
|
if (this.byteOffset >= this.input.length) {
|
|
throw new Error('Reached end of input');
|
|
}
|
|
const currentByte = this.input[this.byteOffset];
|
|
const bitsLeft = 8 - this.bitOffset;
|
|
const bitsToRead = Math.min(length - bitsRead, bitsLeft);
|
|
if (this.endianness === 'little-endian') {
|
|
const mask = (1 << bitsToRead) - 1;
|
|
const bits = (currentByte >> this.bitOffset) & mask;
|
|
result |= bits << bitsRead;
|
|
}
|
|
else {
|
|
const mask = ((1 << bitsToRead) - 1) << (8 - this.bitOffset - bitsToRead);
|
|
const bits = (currentByte & mask) >> (8 - this.bitOffset - bitsToRead);
|
|
result = (result << bitsToRead) | bits;
|
|
}
|
|
bitsRead += bitsToRead;
|
|
this.bitOffset += bitsToRead;
|
|
if (this.bitOffset === 8) {
|
|
this.byteOffset++;
|
|
this.bitOffset = 0;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
exports.BitReader = BitReader;
|