Class CompressLZF
- All Implemented Interfaces:
Compressor
This class implements the LZF lossless data compression algorithm. LZF is a Lempel-Ziv variant with byte-aligned output, and optimized for speed.
Safety/Use Notes:
- Each instance should be used by a single thread only.
- The data buffers should be smaller than 1 GB.
- For performance reasons, safety checks on expansion are omitted.
- Invalid compressed data can cause an ArrayIndexOutOfBoundsException.
The LZF compressed format knows literal runs and back-references:
- Literal run: directly copy bytes from input to output.
- Back-reference: copy previous data to output stream, with specified offset from location and length. The length is at least 3 bytes.
The first byte of the compressed stream is the control byte. For literal runs, the highest three bits of the control byte are not set, the lower bits are the literal run length, and the next bytes are data to copy directly into the output. For back-references, the highest three bits of the control byte are the back-reference length. If all three bits are set, then the back-reference length is stored in the next byte. The lower bits of the control byte combined with the next byte form the offset for the back-reference.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate int[]
Hash table for matching byte sequences (reused for performance).private static final int
The number of entries in the hash table.private static final int
The maximum number of literals in a chunk (32).private static final int
The maximum offset allowed for a back-reference (8192).private static final int
The maximum back-reference length (264).Fields inherited from interface org.h2.compress.Compressor
DEFLATE, LZF, NO
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionint
compress
(byte[] in, int inPos, int inLen, byte[] out, int outPos) Compress a number of bytes.int
compress
(ByteBuffer in, int inPos, byte[] out, int outPos) Compress a number of bytes.void
expand
(byte[] in, int inPos, int inLen, byte[] out, int outPos, int outLen) Expand a number of compressed bytes.static void
expand
(ByteBuffer in, ByteBuffer out) Expand a number of compressed bytes.private static int
first
(byte[] in, int inPos) Return the integer with the first two bytes 0, then the bytes at the index, then at index+1.private static int
first
(ByteBuffer in, int inPos) Return the integer with the first two bytes 0, then the bytes at the index, then at index+1.int
Get the compression algorithm type.private static int
hash
(int h) Compute the address in the hash table.private static int
next
(int v, byte[] in, int inPos) Shift the value 1 byte left, and add the byte at index inPos+2.private static int
next
(int v, ByteBuffer in, int inPos) Shift the value 1 byte left, and add the byte at index inPos+2.void
setOptions
(String options) Set the compression options.
-
Field Details
-
HASH_SIZE
private static final int HASH_SIZEThe number of entries in the hash table. The size is a trade-off between hash collisions (reduced compression) and speed (amount that fits in CPU cache).- See Also:
-
MAX_LITERAL
private static final int MAX_LITERALThe maximum number of literals in a chunk (32).- See Also:
-
MAX_OFF
private static final int MAX_OFFThe maximum offset allowed for a back-reference (8192).- See Also:
-
MAX_REF
private static final int MAX_REFThe maximum back-reference length (264).- See Also:
-
cachedHashTable
private int[] cachedHashTableHash table for matching byte sequences (reused for performance).
-
-
Constructor Details
-
CompressLZF
public CompressLZF()
-
-
Method Details
-
setOptions
Description copied from interface:Compressor
Set the compression options. This may include settings for higher performance but less compression.- Specified by:
setOptions
in interfaceCompressor
- Parameters:
options
- the options
-
first
private static int first(byte[] in, int inPos) Return the integer with the first two bytes 0, then the bytes at the index, then at index+1. -
first
Return the integer with the first two bytes 0, then the bytes at the index, then at index+1. -
next
private static int next(int v, byte[] in, int inPos) Shift the value 1 byte left, and add the byte at index inPos+2. -
next
Shift the value 1 byte left, and add the byte at index inPos+2. -
hash
private static int hash(int h) Compute the address in the hash table. -
compress
public int compress(byte[] in, int inPos, int inLen, byte[] out, int outPos) Description copied from interface:Compressor
Compress a number of bytes.- Specified by:
compress
in interfaceCompressor
- Parameters:
in
- the input datainPos
- the offset at the input arrayinLen
- the number of bytes to compressout
- the output areaoutPos
- the offset at the output array- Returns:
- the end position
-
compress
Compress a number of bytes.- Parameters:
in
- the input datainPos
- the offset at the input bufferout
- the output areaoutPos
- the offset at the output array- Returns:
- the end position
-
expand
public void expand(byte[] in, int inPos, int inLen, byte[] out, int outPos, int outLen) Description copied from interface:Compressor
Expand a number of compressed bytes.- Specified by:
expand
in interfaceCompressor
- Parameters:
in
- the compressed datainPos
- the offset at the input arrayinLen
- the number of bytes to readout
- the output areaoutPos
- the offset at the output arrayoutLen
- the size of the uncompressed data
-
expand
Expand a number of compressed bytes.- Parameters:
in
- the compressed dataout
- the output area
-
getAlgorithm
public int getAlgorithm()Description copied from interface:Compressor
Get the compression algorithm type.- Specified by:
getAlgorithm
in interfaceCompressor
- Returns:
- the type
-