31 lines
1.3 KiB
JavaScript
31 lines
1.3 KiB
JavaScript
/**
|
|
* Decode FSST compressed data
|
|
*
|
|
* @param symbols Array of symbols, where each symbol can be between 1 and 8 bytes
|
|
* @param symbolLengths Array of symbol lengths, length of each symbol in symbols array
|
|
* @param compressedData FSST Compressed data, where each entry is an index to the symbols array
|
|
* @returns Decoded data as Uint8Array
|
|
*/
|
|
//TODO: improve -> quick and dirty implementation
|
|
export function decodeFsst(symbols, symbolLengths, compressedData) {
|
|
//TODO: use typed array directly
|
|
const decodedData = [];
|
|
const symbolOffsets = new Array(symbolLengths.length).fill(0);
|
|
for (let i = 1; i < symbolLengths.length; i++) {
|
|
symbolOffsets[i] = symbolOffsets[i - 1] + symbolLengths[i - 1];
|
|
}
|
|
for (let i = 0; i < compressedData.length; i++) {
|
|
if (compressedData[i] === 255) {
|
|
decodedData.push(compressedData[++i]);
|
|
}
|
|
else {
|
|
const symbolLength = symbolLengths[compressedData[i]];
|
|
const symbolOffset = symbolOffsets[compressedData[i]];
|
|
for (let j = 0; j < symbolLength; j++) {
|
|
decodedData.push(symbols[symbolOffset + j]);
|
|
}
|
|
}
|
|
}
|
|
return new Uint8Array(decodedData);
|
|
}
|
|
//# sourceMappingURL=fsstDecoder.js.map
|