diff --git a/sk2a/Makefile b/sk2a/Makefile index dd4b40f..daf1383 100644 --- a/sk2a/Makefile +++ b/sk2a/Makefile @@ -1,5 +1,5 @@ CC = gcc -CFLAGS = -g -Wall -Werror +CFLAGS = -g -Wall -Werror -std=c99 all: program @@ -13,4 +13,4 @@ main.o: main.c $(CC) $(CFLAGS) -c main.c -o main.o clean: - rm -rf program *.o *.exe *.exe.stackdump \ No newline at end of file + rm -rf program *.o *.exe *.exe.stackdump diff --git a/sk2a/README.md b/sk2a/README.md index e69de29..f8b7dba 100644 --- a/sk2a/README.md +++ b/sk2a/README.md @@ -0,0 +1,39 @@ +Zadanie + + A. Kompressor + + Naprogramuj nástroj na kompresiu a dekompresiu. Na kompresiu použite aspoň dva kompresné algoritmy, napr. : Huffmanovo kódovanie, LZ77, LZ78, Run Length kódovanie alebo iný. + + Meno vstupného a výstupného súboru načítajte ako argument príkazového riadka. V zadaní by mali byť implementované tieto dve funkcie: + + /** + * Skomprimuje súbor in a zapíše do súboru out. + * @arg in smerník na otvorený vstupný súbor (na čítanie) + * @arg out smerník na otvorený výstupný súbor (na zápis) + * @return počet bajtov skomprimovaného súboru + */ + int compress(FILE* in, FILE* out); + /** + * Dekomprimuje súbor in a zapíše do súboru out. + * @arg in smerník na otvorený vstupný súbor (na čítanie) + * @arg out smerník na otvorený výstupný súbor (na zápis) + * @return počet bajtov dekomprimovaného súboru + */ + void decompress(FILE* in, FILE* out); + + Kompresor a dekompresor by mal byť schopný pracovať s ľubovoľným binárnym súborom do 10 MB. Súbor by mal byť po skomprimovaní menší minimálne o 10 percent a po dekomprimovaní by mal byť zhodný s pôvodným súborom. Pri práci s binárnymi súbormi môžete využiť funkcie fopen(), fread() a fwrite(). + + Na otestovanie kompresora a dekompresora použite súbory z Cantebury corpus + +Riešenie + + Implementácia mojho riešenia zahŕňa algoritmus Run Length Encoding pracujúci na úrovni jednotlivých bajtov. Pri enkódovani sa hľadajú počty po sebe idúcich rovnakých bajtov a zapisuje sa počet namiesto samotných bajtov. Príklad: + + in.txt: out.txt + AAAAAABB A6B2 + + V najlepšom prípade kompresia dokáže enkódovať bajty v pomere 1:127,5, v najhoršom prípade ide "negatívnu" kompresiu s pomerom 2:1. + + Moje riešenie ukladá počet bajtov do jedného bajtu, t.j. maximálne 255. V prípade, že by vstupný súbor obsahoval príkladovo 500 rovnakých znakov A po sebe, uložili by sa ako A255 A245. + + Pri dekódovaní sa v cykle čítajú 2 bajty, prvým je bajt ktorý sa opakuje a druhý je počet opakovaní. Tie sa následne vygenerujú v logickej pamäti programu a následne uložia pomocou jedného volania. \ No newline at end of file diff --git a/sk2a/compressor.o b/sk2a/compressor.o new file mode 100644 index 0000000..7742946 Binary files /dev/null and b/sk2a/compressor.o differ diff --git a/sk2a/input.txt b/sk2a/input.txt new file mode 100644 index 0000000..1857ba6 --- /dev/null +++ b/sk2a/input.txt @@ -0,0 +1 @@ +aaaaaaAAAAAA diff --git a/sk2a/main.o b/sk2a/main.o new file mode 100644 index 0000000..9d3883a Binary files /dev/null and b/sk2a/main.o differ diff --git a/sk2a/output.txt b/sk2a/output.txt new file mode 100644 index 0000000..05e97d4 --- /dev/null +++ b/sk2a/output.txt @@ -0,0 +1,2 @@ +aA + \ No newline at end of file diff --git a/sk2a/program b/sk2a/program new file mode 100755 index 0000000..0998724 Binary files /dev/null and b/sk2a/program differ