Strumento in C per la compressione e decompressione di file tramite algoritmo Run-Length Encoding (RLE).
Il programma principale scansiona ricorsivamente una directory e comprime tutti i file la cui dimensione supera una soglia specificata, producendo file con estensione .gz.
Run-Length Encoding sostituisce sequenze di byte ripetuti consecutivi con una coppia (byte, conteggio).
Esempio:
Input: AAABBBBBCC
Output: A3B5C2
RLE è efficace su file che contengono lunghe sequenze di byte ripetuti:
| Tipo di file | Motivo |
|---|---|
| File di testo con molti spazi o caratteri ripetuti | Alta ridondanza |
| Immagini bitmap (BMP) non compresse | Grandi aree di colore uniforme |
| File binari semplici con pattern ripetitivi | Struttura regolare |
| File di log con molte righe simili | Sequenze di caratteri uguali |
RLE è controproducente (può aumentare la dimensione del file) su file già compressi o con dati eterogenei:
| Tipo di file | Motivo |
|---|---|
| JPEG, PNG, MP3, AAC | Già compressi internamente |
| ZIP, tar.gz, 7z | Già compressi |
| File cifrati | Byte pseudo-casuali, nessuna ripetizione |
| Eseguibili (.exe, ELF) | Dati misti, poca ridondanza |
| Contiene stream già compressi |
file-compressor/
├── app.c # Entry point: scansione ricorsiva di directory
├── compressor.c # Implementazione compressione RLE
├── decompressor.c # Implementazione decompressione RLE (con main proprio)
├── compressor.h
├── decompressor.h
Clona il repository e spostatici con:
cd file-compressorCompila il compressore (scansione directory):
gcc app.c compressor.c -o mainIl file eseguibile appena generato accetterà due parametri:
--path: il percorso da analizzare ricorsivamente in cerca dei file da comprimere.
--size: dimensione massima in byte, oltre la quale il file verrà compresso.
Per esempio:
./main ~/path-to-analyze 20000Analizzerà la directory path-to-analyze e le sue sotto-directory. I file al suo interno
che superano i 20KB verranno compressi e gli verrà aggiunta l'estensione .gz.
Compila il decompressore:
gcc decompressor.c -o decompressor./decompressor <file_compresso.gz> <file_output>Esempio:
./decompressor documento.txt.gz documento.txt