.profile/mii/bitstream.class.js
2018-02-20 21:23:40 -05:00

87 lines
No EOL
1.5 KiB
JavaScript

let bufferpack = require('bufferpack');
class BitStream {
constructor(data) {
this.pos = 0;
this.bit_pos = 0;
this.buff = data;
}
align() {
this.bit_pos = 0;
this.pos += 1;
}
read(len) {
let data = this.buff.subarray(this.pos, this.pos + len);
this.pos += len;
return data;
}
bit() {
let byte = this.buff[this.pos];
let value = (byte >> (7 - this.bit_pos)) & 1;
this.bit_pos += 1
if (this.bit_pos == 8) {
this.bit_pos = 0
this.pos += 1
}
return value
}
bits(len) {
let value = 0;
for (let i=0;i<len;i++) {
value = value << 1;
value |= this.bit();
}
return value;
}
wchars(len) {
let char_list = this.list(this.u16, len),
str = '';
for (let char of char_list) {
if (char > 0) {
str += String.fromCharCode(char);
}
}
return str;
}
list(func, times) {
let lst = []
for (let i=0;i<times;i++) {
lst.push(func(this));
}
return lst;
}
u8(self) {
let src = this;
if (self) src = self;
return src.read(1).readUInt8(0);
}
u16(self) {
let src = this;
if (self) src = self;
let rt = bufferpack.unpack(">H", src.read(2))[0];
return rt;
}
}
module.exports = BitStream;