Initial working version
This commit is contained in:
+54
@@ -0,0 +1,54 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.BitReader = void 0;
|
||||
const Token = require("token-types");
|
||||
class BitReader {
|
||||
constructor(tokenizer) {
|
||||
this.tokenizer = tokenizer;
|
||||
this.pos = 0;
|
||||
this.dword = undefined;
|
||||
}
|
||||
/**
|
||||
*
|
||||
* @param bits 1..30 bits
|
||||
*/
|
||||
async read(bits) {
|
||||
while (this.dword === undefined) {
|
||||
this.dword = await this.tokenizer.readToken(Token.UINT32_LE);
|
||||
}
|
||||
let out = this.dword;
|
||||
this.pos += bits;
|
||||
if (this.pos < 32) {
|
||||
out >>>= (32 - this.pos);
|
||||
return out & ((1 << bits) - 1);
|
||||
}
|
||||
else {
|
||||
this.pos -= 32;
|
||||
if (this.pos === 0) {
|
||||
this.dword = undefined;
|
||||
return out & ((1 << bits) - 1);
|
||||
}
|
||||
else {
|
||||
this.dword = await this.tokenizer.readToken(Token.UINT32_LE);
|
||||
if (this.pos) {
|
||||
out <<= this.pos;
|
||||
out |= this.dword >>> (32 - this.pos);
|
||||
}
|
||||
return out & ((1 << bits) - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
async ignore(bits) {
|
||||
if (this.pos > 0) {
|
||||
const remaining = 32 - this.pos;
|
||||
this.dword = undefined;
|
||||
bits -= remaining;
|
||||
this.pos = 0;
|
||||
}
|
||||
const remainder = bits % 32;
|
||||
const numOfWords = (bits - remainder) / 32;
|
||||
await this.tokenizer.ignore(numOfWords * 4);
|
||||
return this.read(remainder);
|
||||
}
|
||||
}
|
||||
exports.BitReader = BitReader;
|
||||
Reference in New Issue
Block a user