mirror of
https://github.com/regular/unbzip2-stream.git
synced 2024-11-22 08:26:12 +00:00
fb948b73c9
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.
40 lines
1.1 KiB
JavaScript
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;
|
|
};
|