2.3 KiB
Kompressor – domáca časť skúšky
Zadanie
Cieľom zadania je naprogramovať nástroj na kompresiu a dekompresiu súborov. Program musí fungovať pre ľubovoľné binárne súbory do veľkosti 10 MB. Po dekompresii musí byť výsledný súbor rovnaký ako pôvodný.
Nie je povolené použiť RLE (Run Length Encoding). Je povolené použiť napríklad Huffmanovo kódovanie alebo iný algoritmus.
Popis programu
Program umožňuje:
- skomprimovať súbor
- dekomprimovať súbor
- vypísať pomoc pri spustení
Program sa spúšťa z príkazového riadka a pracuje so súbormi zadanými ako argumenty.
Použitý algoritmus
Použil som Huffmanovo kódovanie.
Najprv sa spočítajú frekvencie jednotlivých bajtov vo vstupnom súbore. Podľa frekvencií sa vytvorí Huffmanov strom. Každému bajtu sa priradí bitový kód.
Do výsledného súboru sa uloží:
- veľkosť pôvodného súboru
- tabuľka frekvencií
- skomprimovaný bitový tok
Pri dekompresii sa z tabuľky frekvencií znovu vytvorí strom a pomocou neho sa dáta dekódujú späť.
Použitie programu
./compressor -c vstupny_subor vystupny_subor Skomprimuje vstupný súbor do výstupného. ./compressor -d skomprimovany_subor vystupny_subor Dekompresia späť na pôvodné dáta. ./compressor -h Vypíše pomoc.
Technické detaily
- program je napísaný v jazyku C (štandard C11)
- používa iba štandardnú knižnicu C
- práca so súbormi je realizovaná pomocou fopen, fread a fwrite
- program je rozdelený na viac súborov:
- main.c – spracovanie argumentov a spustenie programu
- compressor.c – implementácia kompresie a dekompresie
- compressor.h – hlavičkový súbor
- preklad prebieha pomocou Makefile
Obmedzenia
- maximálna veľkosť vstupného súboru je 10 MB
- kompresia nemusí byť efektívna pre všetky typy súborov
- program nevyužíva žiadne externé knižnice
Testovanie
Program bol testovaný na súboroch z Canterbury corpus. Po dekompresii bol výsledný súbor vždy zhodný s pôvodným.
Použité zdroje
- študijné materiály k predmetu
- základný popis Huffmanovho kódovania
- generatívny model ChatGPT (OpenAI)
Použitý prompt: "Implement Huffman compression in C without external libraries"