# **huff**

[![Crate][crate_img]][crate]

[![License][license_img]][license_file]

Example compression/decompression CLI software based on the [**huff_coding**][lib] crate.

## Usage

```txt
huff [FLAGS] [OPTIONS] <SRC_FILE> [DST_FILE]
```

## Args

```txt
<SRC_FILE>    
<DST_FILE>    [default: ./SRC_FILE.hff]
```

## Options

```txt
-b, --block-size <SIZE>
        Set how many bytes can be loaded from the file at one time
        Possible units: 
            K/Ki -> Kilobytes/Kibibytes
            M/Mi -> Megabytes/Mebibytes
            G/Gi -> Gigabytes/Gibibytes
         [default: 2G]
```

## Flags

```txt
-d, --decompress    
        Decompresses the hff SRC_FILE into DST_FILE.hff
            
-n, --noask         
        Omits asking if should replace existing DST_FILE

-r, --replace       
        Deletes SRC_FILE upon completion

-t, --time          
        Prints how long it took to finish
-h, --help          
        Prints help information

-V, --version       
        Prints version information
```

## File format

The *hff* file format is encoded as follows:

1. A byte containing the number of bits used for padding:
   * first 4 bits store the [`HuffTree`'s][tree] padding bits
   * the remaining bits store the compressed data's padding bits
2. 4 byte number representing the length (in bytes) of the stored [`HuffTree`][tree]
3. A [`HuffTree`][tree], used to compress the file,
represented in binary (see [`HuffTree::try_from_bin`][tree_from_bin])
4. The actual compressed data

[license_file]:https://github.com/kxlsx/huffman-coding-rs/blob/master/LICENSE
[license_img]: https://img.shields.io/crates/l/huff.svg
[crate]:https://crates.io/crates/huff
[crate_img]:https://img.shields.io/crates/v/huff.svg?logo=rust

[lib]:https://github.com/kxlsx/huffman-coding-rs/tree/master/huff_coding
[tree]:https://github.com/kxlsx/huffman-coding-rs/blob/master/huff_coding/src/tree/mod.rs#L27
[tree_from_bin]:https://github.com/kxlsx/huffman-coding-rs/blob/master/huff_coding/src/tree/mod.rs#L452
