1
0
mirror of https://github.com/regular/unbzip2-stream.git synced 2024-11-22 08:26:12 +00:00
unbzip2-stream/lib/bit_iterator.js
Stefan Friesel fb948b73c9 Check stream CRC
In addition to the per-block CRC sums, the stream ends with a checksum
that combines all CRC sums; check that one as well. Also align the bit reader
to the next byte boundary in the end to allow reading data that follows.
2018-09-15 21:28:39 +02:00

40 lines
1.1 KiB
JavaScript

var BITMASK = [0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF];
// returns a function that reads bits.
// takes a buffer iterator as input
module.exports = function bitIterator(nextBuffer) {
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)
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;
};
f.bytesRead = 0;
return f;
};