uxn-utils/cli/lz/explanation.md

56 lines
2.4 KiB
Markdown
Raw Normal View History

2023-11-14 21:54:31 -05:00
Simple Uxn LZ Format
====================
Goals:
* Anyone can implement it
* Small source code size
* Easy to implement from Uxn
* Mildly better than RLE
Non-goals:
* High compression ratio
* High compression speed
Format
------
It's a stream of commands. The first byte encodes the first command. Read the commands from the input until there's no more input.
There are two commands. Literal and dictionary.
```
Byte 1 Byte 2+n
┌─────────────────┐ ┌─────
Literal │ 0 x x x x x x x │ │ ....
(Always 1 byte) └─────────────────┘ └─────
Length of literal Bytes to copy to output
(Adjust by adding 1)
Byte 1 Byte 2
Dictionary ┌─────────────────┐ ┌─────────────────┐
(2 bytes version)│ 1 0 x x x x x x │ │ x x x x x x x x │
└─────────────────┘ └─────────────────┘
Length of Offset into
dictionary match dictionary
(Adjust by adding 4) (Adjust by adding 1)
Byte 1 Byte 2 Byte 3
Dictionary ┌─────────────────┬─────────────────┐ ┌─────────────────┐
(3 bytes version)│ 1 1 x x x x x x │ x x x x x x x x │ │ x x x x x x x x │
└─────────────────┴─────────────────┘ └─────────────────┘
Length of dictionary match Offset into
(Adjust by adding 4) dictionary
(Adjust by adding 1)
```
* The maximum dictionary history size is 256 bytes.
* Dictionary offsets should be treated as the distance from the end of last byte that was output.
* Example: an offset of 0 means go back by 1 bytes into the history.
* `a b c d e f|g`
* Example: an offset of 5 means go back by 6 bytes into the history.
* `a|b c d e f g`