This repository has been archived on 2022-08-10. You can view files and clone it, but cannot push or open issues or pull requests.
chez-openbsd/lz4/examples/dictionaryRandomAccess.md
2022-07-29 15:12:07 +02:00

2.1 KiB

LZ4 API Example : Dictionary Random Access

dictionaryRandomAccess.c is LZ4 API example which implements dictionary compression and random access decompression.

Please note that the output file is not compatible with lz4frame and is platform dependent.

What's the point of this example ?

  • Dictionary based compression for homogenous files.
  • Random access to compressed blocks.

How the compression works

Reads the dictionary from a file, and uses it as the history for each block. This allows each block to be independent, but maintains compression ratio.

    Dictionary
         +
         |
         v
    +---------+
    | Block#1 |
    +----+----+
         |
         v
      {Out#1}


    Dictionary
         +
         |
         v
    +---------+
    | Block#2 |
    +----+----+
         |
         v
      {Out#2}

After writing the magic bytes TEST and then the compressed blocks, write out the jump table. The last 4 bytes is an integer containing the number of blocks in the stream. If there are N blocks, then just before the last 4 bytes is N + 1 4 byte integers containing the offsets at the beginning and end of each block. Let Offset#K be the total number of bytes written after writing out Block#K including the magic bytes for simplicity.

+------+---------+     +---------+---+----------+     +----------+-----+
| TEST | Block#1 | ... | Block#N | 4 | Offset#1 | ... | Offset#N | N+1 |
+------+---------+     +---------+---+----------+     +----------+-----+

How the decompression works

Decompression will do reverse order.

  • Seek to the last 4 bytes of the file and read the number of offsets.
  • Read each offset into an array.
  • Seek to the first block containing data we want to read. We know where to look because we know each block contains a fixed amount of uncompressed data, except possibly the last.
  • Decompress it and write what data we need from it to the file.
  • Read the next block.
  • Decompress it and write that page to the file.

Continue these procedure until all the required data has been read.