deflate_stored(data : BytesView) -> Bytesdeflate_fixed(data : BytesView, is_final : Bool, good_match : Int, max_chain : Int) -> Bytesdeflate_dynamic(data : BytesView, is_final : Bool, good_match : Int, max_chain : Int) -> Byteslet decompressed = inflate(compressed[0:compressed.length()], Some(expected_len))
let crc32 = @crc32.bytes_crc32(decompressed[:])
let adler32 = @adler32.bytes_adler32(decompressed[:])pub fn length_to_symbol(length : Int) -> Int
pub fn distance_to_symbol(dist : Int) -> Intpub fn write_literal_symbol(writer, encoder, symbol) -> Unit
pub fn write_length_distance(writer, litlen_encoder, dist_encoder, length, distance) -> Unit///|
test {
let data = b"Hello, DEFLATE compression!"
// Compress with default settings
let compressed = @deflate.deflate_dynamic(
data[0:data.length()],
true,
8,
1024,
)
// Decompress
let decompressed = @deflate.inflate(compressed[0:compressed.length()])
@json.inspect(decompressed.length(), content=27)
}// Compress and get CRC-32
let compressed = deflate_dynamic(data[0:data.length()], true, 8, 1024)
// (Former helper inflate_and_crc32 removed) Explicit pattern:
let decompressed = inflate(compressed[0:compressed.length()], decompressed_size=data.length())
let crc = @crc32.bytes_crc32(decompressed[:])// Fast compression (Level 1)
let fast = deflate_fixed(data, 0, len, true, 4, 128)
// Default compression (Level 6)
let default = deflate_dynamic(data, 0, len, true, 8, 1024)
// Maximum compression (Level 9)
let best = deflate_dynamic(data, 0, len, true, 32, 4096)let block_size = 32768
let blocks = []
for i = 0; i < data.length(); i += block_size {
let len = (data.length() - i).min(block_size)
let is_final = (i + len >= data.length())
let block = deflate_dynamic(data, i, len, is_final, 8, 1024)
blocks.push(block)
}
// Concatenate blocks
let compressed = concat_bytes(blocks)| Value | Behavior | Speed | Compression |
|---|---|---|---|
| 4 | Stop at 4-byte match | Fastest | Lower |
| 8 | Stop at 8-byte match | Balanced | Good |
| 32 | Stop at 32-byte match | Slower | Best |
| Value | Behavior | Speed | Compression |
|---|---|---|---|
| 128 | Check 128 positions | Fastest | Lower |
| 1024 | Check 1024 positions | Balanced | Good |
| 4096 | Check 4096 positions | Slowest | Best |
Input Data
↓
LZ77 String Matching
↓
(literals + length/distance pairs)
↓
Frequency Analysis
↓
Huffman Tree Construction
↓
Huffman Encoding
↓
Bit Packing
↓
Compressed OutputCompressed Data
↓
Bit Unpacking
↓
Block Header Parsing
↓
Huffman Tree Reconstruction
↓
Symbol Decoding
↓
LZ77 Back-Reference Expansion
↓
Decompressed OutputBFINAL (1 bit): 1 = final block, 0 = more blocks
BTYPE (2 bits): 00 = stored, 01 = fixed Huffman, 10 = dynamic Huffman- Skip to byte boundary
- LEN (2 bytes, little-endian)
- NLEN (2 bytes, one's complement of LEN)
- Raw data (LEN bytes)- Encoded symbols using predefined trees
- Symbols: literals (0-255), length (257-285), end-of-block (256)
- Distance codes follow length codes- HLIT (5 bits): # of literal codes - 257
- HDIST (5 bits): # of distance codes - 1- Literal/length code lengths (encoded)
#### `deflate_dynamic(data : BytesView, is_final : Bool, good_match : Int, max_chain : Int) -> Bytes`
- Encoded data
#### `deflate_dynamic(data : BytesView, is_final : Bool, good_match : Int, max_chain : Int) -> Bytes`
let compressed = @deflate.deflate_dynamic(data[0:data.length()], true, 8, 1024)
// Compress and get CRC-32
let compressed = deflate_dynamic(data[0:data.length()], true, 8, 1024)
let default = deflate_dynamic(data[0:len], true, 8, 1024)
let best = deflate_dynamic(data[0:len], true, 32, 4096)
let block = deflate_dynamic(data[i:i + len], is_final, 8, 1024)
- **Compression**: ~100KB (hash tables + buffers)
- **Decompression**: ~300KB (Huffman trees + output buffer)
- **No streaming**: Processes entire block in memory
## Testing
Run tests with:
```bash
moon test deflatefn deflate_dynamic(data : BytesView, is_final : Bool, good_match : Int, max_chain : Int) -> Bytesfn deflate_fixed(data : BytesView, is_final : Bool, good_match : Int, max_chain : Int) -> Bytesfn deflate_stored(data : BytesView) -> Bytes raisefn inflate(src_view : BytesView, decompressed_size? : Int) -> Bytes raisefn zlib_decompress(data : BytesView) -> (Bytes, UInt) raiseInstall
Download zip