45 lines
1009 B
TypeScript
45 lines
1009 B
TypeScript
var BITMASK = [0, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff];
|
|
|
|
// returns a function that reads bits.
|
|
// takes a buffer iterator as input
|
|
export function bitIterator(nextBuffer: () => Buffer) {
|
|
var bit = 0,
|
|
byte = 0;
|
|
var bytes = nextBuffer();
|
|
var f = function (n) {
|
|
if (n === null && bit != 0) {
|
|
// align to byte boundary
|
|
bit = 0;
|
|
byte++;
|
|
return;
|
|
}
|
|
var result = 0;
|
|
while (n > 0) {
|
|
if (byte >= bytes.length) {
|
|
byte = 0;
|
|
bytes = nextBuffer();
|
|
}
|
|
var left = 8 - bit;
|
|
if (bit === 0 && n > 0)
|
|
// @ts-ignore
|
|
f.bytesRead++;
|
|
if (n >= left) {
|
|
result <<= left;
|
|
result |= BITMASK[left] & bytes[byte++];
|
|
bit = 0;
|
|
n -= left;
|
|
} else {
|
|
result <<= n;
|
|
result |=
|
|
(bytes[byte] & (BITMASK[n] << (8 - n - bit))) >> (8 - n - bit);
|
|
bit += n;
|
|
n = 0;
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
// @ts-ignore
|
|
f.bytesRead = 0;
|
|
return f;
|
|
}
|