usaa24/sk1
2025-01-10 13:46:31 +00:00
..
compressor.c Update sk1/compressor.c 2024-12-26 15:59:08 +00:00
compressor.h Update sk1/compressor.h 2024-12-26 15:59:35 +00:00
main.c Update sk1/main.c 2024-12-26 17:33:31 +00:00
Makefile Update sk1/Makefile 2024-12-26 16:02:20 +00:00
README.md Update sk1/README.md 2025-01-10 13:46:31 +00:00

Zadanie:

Do programu sa zadáva súbor so stlačenými údajmi, ktoré boli zakódované pomocou algoritmov RLE alebo LZ77. Úlohou programu je zabezpečiť správnu kompresiu a dekompresiu textových a binárnych súborov.

Program podporuje nasledujúce funkcie:

Kompresia súborov pomocou RLE (Run-Length Encoding). Dekompresia súborov stlačených pomocou RLE. Kompresia súborov pomocou LZ77 (Sliding Window Compression). Dekompresia súborov stlačených pomocou LZ77. Formát vstupu:

Vstupné súbory môžu byť textové alebo binárne. Pre RLE každý stlačený blok pozostáva z bajtu znaku a jeho počtu. Pre LZ77 sa používajú trojice: offset, dĺžka, nasledujúci znak. Formát výstupu:

Veľkosť stlačeného alebo dekomprimovaného súboru v bajtoch. V prípade chyby sa vypíše správa s vysvetlením a program ukončí svoju činnosť. Program kontroluje správnosť vstupných údajov a spracováva chyby, napríklad poškodený alebo neúplný súbor kompresie.

Implementácia:

Program sa skladá z:

Hlavných štruktúr:

struct LZ77Triple: Štruktúra, ktorá predstavuje trojice (offset, length, next_char) pre LZ77. Funkcií:

int rle_compress(const char* input_filename, const char* output_filename) Implementuje algoritmus kompresie RLE. Číta znaky a počíta ich opakovania. Vracia veľkosť stlačeného súboru alebo kód chyby.

int rle_decompress(const char* input_filename, const char* output_filename) Rekonštruuje pôvodný súbor zo stlačených údajov RLE. Vracia veľkosť dekomprimovaného súboru alebo kód chyby.

int lz77_compress(const char* input_filename, const char* output_filename) Implementuje algoritmus LZ77 s použitím posuvného okna a vyrovnávacej pamäte na predbežné prezeranie. Vracia veľkosť stlačeného súboru alebo kód chyby.

int lz77_decompress(const char* input_filename, const char* output_filename) Rekonštruuje pôvodný súbor zo stlačených údajov LZ77. Vracia veľkosť dekomprimovaného súboru alebo kód chyby.

int main(int argc, char* argv[]) Spracováva argumenty príkazového riadka. Volá príslušné funkcie na základe zadaných argumentov (-c, -d, -c2, -d2). Vypisuje výsledky alebo chybové hlásenia.

void display_help() Vypisuje informačnú nápovedu o dostupných príkazoch.

Štrukturálny opis riešenia

Projekt je postavený pomocou modulárneho prístupu. Hlavné komponenty:

compressor.h: Hlavičkový súbor obsahujúci deklarácie funkcií na kompresiu a dekompresiu. compressor.c: Implementácia algoritmov RLE a LZ77 pre kompresiu a dekompresiu. main.c: Hlavný modul, ktorý spracováva argumenty príkazového riadka a volá príslušné funkcie na kompresiu alebo dekompresiu. Implementácia:

RLE: Funguje na princípe ukladania znaku a počtu jeho opakovaní. LZ77: Používa posuvné okno na vyhľadávanie opakujúcich sa sekvencií bajtov.

Prevádzkové podmienky

Program funguje správne za nasledujúcich podmienok:

Súbory sú dostupné na čítanie a zápis. Vstupné údaje neobsahujú chyby, ako je nesúlad formátu alebo poškodenie. Pridelená pamäť na spracovanie údajov nepresahuje limity systému.

Zoznam použitých zdrojov

Wikipedia - Run Length Encoding - https://en.wikipedia.org/wiki/Run-length_encoding

Wikipedia - LZ77 and LZ78 - https://en.wikipedia.org/wiki/LZ77_and_LZ78

GeeksforGeeks - Run Length Encoding Algorithm - https://www.geeksforgeeks.org/run-length-encoding/

Stackoverflow - LZ77 Algorithm - https://stackoverflow.com/questions/71708874/could-you-give-me-some-explain-of-lz77-algorithm