@cley_faye/lzw
v2.0.0
Published
Pure JavaScript implementation of LZW compression
Downloads
448
Readme
@cley_faye/lzw
Pure JavaScript implementation of LZW compression
Provide a low-level implementation of the LZW algorithm as well as minimal support for compression/decompression of byte buffers.
Installation
npm install @cley_faye/lzwUsage
The package uses the JavaScript ES module syntax.
Low-level usage
At low-level, LZW only handle numeric "codes" for both input and output. It is possible to create an instance able to compress any input dictionary, but for convenience functions to create a "byte" dictionary (handling all 256 values) is provided.
How to compress and decompress a sequence of input codes:
import {CodeCompress, CodeDecompress} from "@cley_faye/lzw";
const input = [1, 2, 3, 4];
// Compression
const compress = CodeCompress.createSingleBytes();
const compressed = [];
input.forEach(inputCode => {
const outputCodes = compress.addInput(inputCode);
if (outputCodes) {
compressed.push(...outputCodes);
}
});
const finalCodes = compress.endInput();
if (finalCodes) {
compressed.push(...finalCodes);
}
console.log(compressed);
// Decompression
const decompress = CodeDecompress.createSingleBytes();
const decompressed = [];
compressed.forEach(inputCode => {
const outputCodes = decompress.addInput(inputCode);
decompressed.push(...outputCodes);
});
console.log(decompressed);Usage with Uint8Array
Encoding of output codes into sequence of bits/bytes is also included.
Here's a basic example:
import {CompressBuf8, DecompressBuf8} from "@cley_faye/lzw";
const input = new Uint8Array([1, 2, 3, 4]);
// Compression
const compressed = CompressBuf8.compressBytes(input);
// Decompression
const decompressed = DecompressBuf8.decompressBytes(compressed);You can also process chunks by creating an instance of CompressBuf8 or DecompressBuf8.
Encoding
This is incompatible with streams made with the version 1 of this library.
Compressed Uint8Array are prefixed with a single byte indicating the settings from the compressor.
Beyond that first byte, dictionary codes are output using the least amount of bit necessary to
represent the largest entry of the dictionary.
If configured, a reset code (256) and a stop code (257, or 256 if no reset code) are added to the
dictionary on start/reset.
The initial 256 first values of the dictionary are just their corresponding byte.
Settings
The library exposes most settings expected when handling LZW. Most notably:
- Setting a limit to the dictionary size can be done using the
maxCodeValueargument, either when creating a custom dictionary or with helper functions. - Outputing a "stop" code can be disabled with the
setStopargument - Storage order (most significant bit first or not) is handled with the
msbargument.
It is advised to leave the default values for setStop (true) and msb (true).
Specifying a value for maxCodeValue will lower compression efficiency, but also limit the memory
needed to compress/decompress, as the dictionary can grow quite large quite fast.
