2022-05-26 11:46:36 +08:00

67 lines
1.8 KiB
TypeScript

/**
*/
export default class LZW {
static decode(arr, min) {
let clearCode = 1 << min,
eofCode = clearCode + 1,
size = min + 1,
dict = [],
pos = 0;
function clear() {
let i;
dict = [];
size = min + 1;
for (i = 0; i < clearCode; i++) {
dict[i] = [i];
}
dict[clearCode] = [];
dict[eofCode] = null;
}
function decode() {
let out = [],
code, last;
while (1) {
last = code;
code = read(size);
if (code == clearCode) {
clear();
continue;
}
if (code == eofCode) {
break;
}
if (code < dict.length) {
if (last !== clearCode) {
dict.push(dict[last].concat(dict[code][0]));
}
} else {
if (code !== dict.length) {
throw new Error('error');
}
dict.push(dict[last].concat(dict[last][0]));
}
out.push.apply(out, dict[code]);
if (dict.length === (1 << size) && size < 12) {
size++;
}
}
return out;
}
function read(size) {
let i, code = 0;
for (i = 0; i < size; i++) {
if (arr[pos >> 3] & 1 << (pos & 7)) {
code |= 1 << i;
}
pos++;
}
return code;
}
// return { decode: decode }
return decode();
}
}