From 44e894521532de75c772c3da8702b7c2ce966bbb Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 11 Jan 2026 21:32:18 +0100 Subject: [PATCH] funguje --- sk1/Makefile | 17 ++++ sk1/README.md | 82 ++++++++++++++++ sk1/compressor | Bin 0 -> 16696 bytes sk1/compressor.c | 249 +++++++++++++++++++++++++++++++++++++++++++++++ sk1/compressor.h | 7 ++ sk1/compressor.o | Bin 0 -> 7144 bytes sk1/main.c | 38 ++++++++ sk1/main.o | Bin 0 -> 2904 bytes 8 files changed, 393 insertions(+) create mode 100644 sk1/Makefile create mode 100644 sk1/README.md create mode 100755 sk1/compressor create mode 100644 sk1/compressor.c create mode 100644 sk1/compressor.h create mode 100644 sk1/compressor.o create mode 100644 sk1/main.c create mode 100644 sk1/main.o diff --git a/sk1/Makefile b/sk1/Makefile new file mode 100644 index 0000000..18c2139 --- /dev/null +++ b/sk1/Makefile @@ -0,0 +1,17 @@ +CC = gcc +CFLAGS = -std=c11 -Wall -Wextra -O2 + +all: compressor + +compressor: main.o compressor.o + $(CC) $(CFLAGS) -o compressor main.o compressor.o + +main.o: main.c compressor.h + $(CC) $(CFLAGS) -c main.c + +compressor.o: compressor.c compressor.h + $(CC) $(CFLAGS) -c compressor.c + +clean: + rm -f *.o compressor + diff --git a/sk1/README.md b/sk1/README.md new file mode 100644 index 0000000..6e451ea --- /dev/null +++ b/sk1/README.md @@ -0,0 +1,82 @@ +# 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" + diff --git a/sk1/compressor b/sk1/compressor new file mode 100755 index 0000000000000000000000000000000000000000..df24ac95506eedc5f77ddd7f46edecb1c5c2db5e GIT binary patch literal 16696 zcmeHO4{%$>nP2%&BJxKPB%y{-A~=zT1`9hlX_6AK965Oc1q^ZEIwYvFCEFTo$w*Jc z2AV&onC4Y63B67)*Zb3yIeN^|a$%0kB{YC&LIMTu0?gcnDWwh<8i^z%F%Uv1(fz)C zyU$NA7Uep3GdDM0kM-^M+wc4K+i&;n+kNlt+UDSr3Y(3|RLO2&#C`iB9cdH=eG5be zq>;^Mlkq!)UCzdVui}_q-l!9l>gixbDYXl{5|s36C^HJZOoy4I(nF%8S1xT66-dfl zx+LjUQ&#X+daqNLlT?-)^||$OW}#bz|B{;ZC^lWSx?b0!Qu?@v%XUGf9qJh zhnb|ZzT2Qjarv@IcJu9`zH@Z< z{fcDBZ_*(dN@PzC5#lK?W%PKgCs+<2_ImVRdpJ<$rvqfyGtZ>hP)fi zPM{1PD}&!v2A@|3zrGCq8gMuMt?8=(M)Q+mI2yjV4Bl1-e;c?P|JGy!aHSO_J``&2 z3x_&l@o;zS{wUbqWGt?Bgxb6AVLjpQ?nFB<48HbIN)0E~P)|4(XC1w1wVkEZWP499 z>qzuQ0kwB0Qc>2CjPjpwge9Y^WAO;y8a$R>^7d2DGg(6l%- z$9tW(!N`x~t{chD@y=zTKC5A_Qr^^({Hbaib&p0KI0*kqdFwg~>|M}COmU&($X z`1GYDU%?&&Pf58)-l*ert(mXGArmgId6LYV@Cmvq z|2=8K#jS?pXH2+kI~A-G_;}=LEXlOdgwuQ>(-srX?{lJHs|nZV3%y{Q38y+_dfbG| zSWww^6OKR|X{QOFXrP!3P52}e{*nnthZ^aC33nLiSY|8&V-XmOz*q#vA}|(#|BVQI z=)C-_k~wBqvej>0%a}5dQ!9!Gl+0fH9$sB>?oEJ)i&xzY;+(-qzKcqR3x|ru;ug-+ z0%f@Hy1~;zX}Iu$!P5e1xbT$0)52xA@Dqcl1

Z5re0N%5Y)5!P5d|xNxt*)52u9 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 literal 0 HcmV?d00001 diff --git a/sk1/compressor.c b/sk1/compressor.c new file mode 100644 index 0000000..84f5bbf --- /dev/null +++ b/sk1/compressor.c @@ -0,0 +1,249 @@ +#include "compressor.h" +#include +#include +#include +#include + +#define BYTE_RANGE 256 +#define IO_BUFFER 8192 + +typedef struct HuffNode { + int value; + uint32_t weight; + struct HuffNode *zero; + struct HuffNode *one; +} HuffNode; + +typedef struct { + uint32_t pattern; + uint8_t size; +} BitCode; + +static HuffNode *node_create(int value, uint32_t weight) +{ + HuffNode *n=malloc(sizeof(HuffNode)); + if (!n) + { + return NULL; + } + n->value=value; + n->weight=weight; + n->zero=NULL; + n->one=NULL; + return n; +} + +static void node_destroy(HuffNode *n) +{ + if (!n) + { + return; + } + node_destroy(n->zero); + node_destroy(n->one); + free(n); +} + +static HuffNode *assemble_tree(uint32_t histogram[]) +{ + HuffNode *pool[BYTE_RANGE*2]; + int pool_size=0; + for (int i = 0; i < BYTE_RANGE; i++) + { + if (histogram[i]>0) + { + pool[pool_size++] = node_create(i, histogram[i]); + } + } + if (pool_size==1) + { + pool[pool_size++]=node_create(-1, 0); + } + while (pool_size>1) + { + int m1=0, m2=1; + if (pool[m2]->weightweight) + { + int t=m1; m1=m2; m2=t; + } + for (int i = 2; i < pool_size; i++) + { + if (pool[i]->weight < pool[m1]->weight) + { + m2=m1; + m1=i; + } else if (pool[i]->weight < pool[m2]->weight) + { + m2=i; + } + } + HuffNode *parent = node_create( + -1, + pool[m1]->weight+pool[m2]->weight + ); + parent->zero=pool[m1]; + parent->one=pool[m2]; + pool[m1]=parent; + pool[m2]=pool[pool_size-1]; + pool_size--; + } + return pool[0]; +} + +static void generate_codes +( + HuffNode *root, + BitCode table[], + uint32_t bits, + uint8_t depth +) { + if (!root) return; + if (root->value >= 0) + { + table[root->value].pattern=bits; + table[root->value].size=depth; + return; + } + generate_codes(root->zero, table, bits << 1, depth + 1); + generate_codes(root->one, table, (bits << 1) | 1, depth + 1); +} + +int pack_binary(const char *input_path, const char *output_path) +{ + FILE *src=fopen(input_path, "rb"); + FILE *dst=fopen(output_path, "wb"); + if (!src || !dst) + { + if (src) fclose(src); + if (dst) fclose(dst); + return 1; + } + uint32_t freq_map[BYTE_RANGE]={0}; + uint8_t buffer[IO_BUFFER]; + size_t read_bytes; + uint32_t total_size=0; + while ((read_bytes = fread(buffer, 1, IO_BUFFER, src)) > 0) + { + total_size += read_bytes; + for (size_t i = 0; i < read_bytes; i++) + { + freq_map[buffer[i]]++; + } + } + rewind(src); + if (fwrite(&total_size, sizeof(uint32_t), 1, dst) != 1 || + fwrite(freq_map, sizeof(uint32_t), BYTE_RANGE, dst) != BYTE_RANGE) + { + fclose(src); + fclose(dst); + return 1; + } + HuffNode *tree=assemble_tree(freq_map); + if (!tree) + { + fclose(src); + fclose(dst); + return 1; + } + BitCode codebook[BYTE_RANGE]; + memset(codebook, 0, sizeof(codebook)); + generate_codes(tree, codebook, 0, 0); + uint8_t out_byte=0; + int bit_count=0; + while ((read_bytes = fread(buffer, 1, IO_BUFFER, src)) > 0) { + for (size_t i = 0; i < read_bytes; i++) + { + BitCode c=codebook[buffer[i]]; + for (int b = c.size - 1; b >= 0; b--) + { + out_byte = (out_byte << 1) | + ((c.pattern >> b) & 1); + bit_count++; + if (bit_count==8) + { + if (fwrite(&out_byte, 1, 1, dst)!=1) + { + node_destroy(tree); + fclose(src); + fclose(dst); + return 1; + } + out_byte=0; + bit_count=0; + } + } + } + } + if (bit_count>0) + { + out_byte <<= (8 - bit_count); + if (fwrite(&out_byte, 1, 1, dst)!=1) + { + node_destroy(tree); + fclose(src); + fclose(dst); + return 1; + } + } + node_destroy(tree); + fclose(src); + fclose(dst); + return 0; +} + +int unpack_binary(const char *input_path, const char *output_path) +{ + FILE *src=fopen(input_path, "rb"); + FILE *dst=fopen(output_path, "wb"); + if (!src || !dst) + { + if (src) fclose(src); + if (dst) fclose(dst); + return 1; + } + uint32_t expected_size; + uint32_t freq_map[BYTE_RANGE]; + if (fread(&expected_size, sizeof(uint32_t), 1, src) != 1 || + fread(freq_map, sizeof(uint32_t), BYTE_RANGE, src) != BYTE_RANGE) + { + fclose(src); + fclose(dst); + return 1; + } + HuffNode *tree=assemble_tree(freq_map); + if (!tree) + { + fclose(src); + fclose(dst); + return 1; + } + HuffNode *cursor=tree; + uint8_t byte; + uint32_t produced=0; + while (produced= 0 && produced < expected_size; i--) + { + int bit=(byte >> i) & 1; + cursor=bit ? cursor->one : cursor->zero; + if (cursor->value>=0) + { + if (fputc(cursor->value, dst)==EOF) + { + node_destroy(tree); + fclose(src); + fclose(dst); + return 1; + } + produced++; + cursor=tree; + } + } + } + node_destroy(tree); + fclose(src); + fclose(dst); + return 0; +} + diff --git a/sk1/compressor.h b/sk1/compressor.h new file mode 100644 index 0000000..652d66c --- /dev/null +++ b/sk1/compressor.h @@ -0,0 +1,7 @@ +#ifndef COMPRESSOR_H +#define COMPRESSOR_H + +int pack_binary(const char *input_path, const char *output_path); +int unpack_binary(const char *input_path, const char *output_path); +#endif + diff --git a/sk1/compressor.o b/sk1/compressor.o new file mode 100644 index 0000000000000000000000000000000000000000..386f164828cacd4bfde55e68c474416ee206db5c GIT binary patch literal 7144 zcmbtZdu&tJ89z61f(zNb9;GZ3bnzrZ!va>E(T&iS<$^TYbwz-9xJw{=v=W6sR5bE9%5mCsy+9o_G30!DjozxS8BDyXq~=bg))uE!;x{jj z9L{7i)Oy}!USWg)tqGd%>#d1DDEgYQm$fQCA%j}gR#dA$rLWdon67Q(#6<{ARCwSq zUhVsHqwjJDwH&jmfsUF3o=VvEr32=@vFV*!)c~>s<)A{heT+UDOLc4RE6JQ!h!y~wZqCbM|_(d8% zAG9|8#if^SahRJt70f~Ao7L>8pvkm0fVNQ6KkgbP5dMt0(h)TKoI!J=YnkPL?{*+D zuD~{kK<{?XV<`epsP!Wj*A7}UjRjguzKW8z4OK&gvPsszt+$DM`F?*KePy2Ro{my% zO=D&OEkPSu7)GB4h6&pta6n^x3F{>j7+%U!GXVQAn2M`fk;mO2 zaTihb#XRB%C1Rl}XkOzgq2@l7uWv(8Cwx5#tNZx+Y98^660tAK(&%)|HzP_GE{F+2847i`K@jULe5_b__X&&)HiCCx-zKUd1 z^BOyTurrOq=S*_v!42&TcXB;o6_wAF{5h>4B=2-tFgJU;d`MG|qDb~7fkM8d<|&2* z%pru_P1V0WuMvK6>|>0!SIBmrh#3#N{FYC+Epx?l7sYK|TyZbD9A7Zu^B z<{&o08l}}UH)!4oq#RX(UOP0ICVs0V{5xwET7M>fZR|KZk01if9GcpMJQt6myc5_Q zvvA_JVk{CwB5a3|2s=LdDs}uc;L!0Ypi;+2sd%n3sUic|v!6gTz89e&+`aP9s z{~nt9ji(lDpysT> z7|@I1q(7|<90Ze>r5s-k!np?xogGza~D7> znlPd4SXRa&kWrX4UwSkEQlaP!@Sit$XmrWhfU=B^&Vd<|)ww6H{;7GBS1*1E3m`^$ z6<-a2FP$|aTk{|v>YE_}^Au~R&tYxg1)~Ee;LFTh$bem{wnkB9qEvF#hI*uGn~s9E z4WT(wwekBPg)hmSS9!u`UUoml_34|?$+EWx6F(lfZOwoS+RR2Dt461EAE>_-i(zo# zDkNokBJ!(|@AxEeWy}e6lenrx|LCv3_uWO9!5MHDvsO9J-QK5At#OshT1d@v$;`&{ zaGzx&61OwP<0wH-3@btN#@I>j2X?MLDD}diKsHAqTe*IPbQI`DPly~s)D18;d#d3f zp4^{H^g)qHJ_2Gb$!I_dvpefY0Q6>+#*Bx>6;LYUR#S zU3G7F=xTMMtVykHo~%{_psSUORo7zGsZVJKU{H1YPpg%UZ>g@vw^b*wuY_M0%7L*I zj37Y1yJWFixvO-s>P|TptJOQpbhUPSxvnlqOlndOy94S4cjS&#IwQ zKm^*Ch98c}_yC5)r0wN9%TkVArMpWO0CWLy7`M=2Tb-pBOY`NEW+0ylalmm8?OpmG z?G37j8-nWAZ?j?NN%3YR?!#|xRyX`{&0*Vh5?I71P#db@vpBD@j z)+G|oa?WW=S@q;IJk06)ILvYi^BRU@wPgp(3rrWm59OyZmM~a8;Qb_9m9wY(c#7kq zPQ_j;OxT|a0^skk4Q|-rKL>m&+QU_|90S&GL%+oaPuk!+ZSWu3;4cBr?0EntFj#HC zdmsFY`AfpR-F?wWEY=(KhRNDUPb3;LB5mQ`j!2AzVzEefdsn2*h(;p$D{r{BtAq3a zSsPFq(cXSJ5{&wwMtLZ)gjz+tAh-THi%FQCeqjU!(`8 zp$-y_JiET9gLFO{U2ninxT`l7A@QC*he&c3*Txj6$r9N2rXCg9S?#sOZ6 zg?JOMlR|u*4Zcsp@jDapKhFyY@HcGma{kHVwjAd#+u)Dc;Lq6Luh`(fw80PB;2+rFRlE-r+W&|R zzQzXMVS~SDgTG{h@3q0p@#X>p%N@^EQRh=Qj`m|O7x+UGJ+>BsKWsz)jD%|v{Q(Kb zek9}!O893b{2d9OD&gmC@R{fg476XCvsJ=ndlcR$3+a1o@a+;V+q26C-)n;(m2kPw zoa1<5UT#SAa$fF8^f(pqEaL}eVIF-FF2~_(5-$7IWP|@$!eu!lHh2v>2?OoHyP~kO zS;A$#tv2{(3CF3BV@bFyXC?3F_(I)+{&k!0!VNSyke;)$bsu|9;9@-_;V55>%X}i_ zi2I70pHn%U+p)0_=XoXGSbw(>YKONG&A!)(Sv1lW@*0ti2Jv=;j1cj*$6|y5-gr;f z`VEn;e&UVx;vRDQyl^hVao-*30gj$tBjSad{5*Cz^Yz-ExVJ9~Cv((5R+JxE*VY*g zbw`9_|L5Bc{OBroJ14Dy&-U^>iVf@$@|Xb&jB|qw!h9bm{0Kv=|2*&(s~_j*U<1aU?2Fw!Fc*Sf)K4+pj0KxAjN4rQXJB58A3y8D+F^XyL}47v YzH-k3ci5R$jQ=Ox{vA2a?4*$Y-|^k5EdT%j literal 0 HcmV?d00001 diff --git a/sk1/main.c b/sk1/main.c new file mode 100644 index 0000000..f0916a8 --- /dev/null +++ b/sk1/main.c @@ -0,0 +1,38 @@ +#include "compressor.h" +#include +#include + +static void print_help(void) { + printf("Binary compressor using Huffman coding\n"); + printf("Usage:\n"); + printf(" ./compressor -c input output\n"); + printf(" ./compressor -d input output\n"); + printf(" ./compressor -h\n"); +} + +int main(int argc, char *argv[]) { + if (argc < 2) { + print_help(); + return 1; + } + + if (strcmp(argv[1], "-h") == 0) { + print_help(); + return 0; + } + + if (argc != 4) { + print_help(); + return 1; + } + + if (strcmp(argv[1], "-c") == 0) + return pack_binary(argv[2], argv[3]); + + if (strcmp(argv[1], "-d") == 0) + return unpack_binary(argv[2], argv[3]); + + print_help(); + return 1; +} + diff --git a/sk1/main.o b/sk1/main.o new file mode 100644 index 0000000000000000000000000000000000000000..5c6799e90567953cce7263765474962e53d900b0 GIT binary patch literal 2904 zcmbtV-ESL35Fa~fYLe)3DLhyd!hx!ONcd`-w1lcc4oT=eSbP*B9@=7^FPGR#d_LWW zlu)%qvWkc-5E3ta0inLYUx0YS68t4Rfk0|e-w;xmScW*lVpx_)l-oFE-^vwR9Tq|9e`*AIQ zZ*Z`BW;Q(~YSTyc&#QAU?NgZE;beN2tK}R#6oh+&BmK< zf7=|IqD~nQTw7VWVx3=ara_Wgm5RM+mrIpYn3cQLs$E{Rs~30!CNaE;;{=Xt@2o=} zU_jUe4wC1F3*w;2MPW`I1<`s@ASd9ww(|<(j)tET_7qTFs=O+UDLAcys8<+Y(D2J>(|zf(g1{-| zcZu2~MtNlM-#rF@{}>!PZac6&2%~n8G+O>n2zGs?OjCuXDowA^v`Et>nl3}5A^4jO zueB{AK%7KgCxkQzU2nV56kj=2M=Ag5O}A z_%jNwo~!bA6ux?HpK*#mr^NYI!RZ~zJT1m41`R1otPn=AMqoZh6~m zZw09xM%~bll0A0!TaC@g?f9b{|A%6sFZC$BQ`8V6QTq?s`Zr16Kh>*-LzVkn#77L$ zUD7$Sj|}@00KI#{W#2|s$oEpwR^qBceTZT{tv~fEidn^>$`5R`R1kHUzs#eCSeC!Z zgqJmc=_l6@*?+A5On9LA>-DF8m{tGJ`7dF>{#1YJA2NSg|0ZH|R2hdVzw!CD3ZgFa zmg}~HsZ^6bqzsXMa_crKl$TDI{+1;2D)X1{*QiiT-M`F0D2cr4{$C=VRX>L>MAn7s zM}1uS%lc)VO-Fsl=ilcaOuZ?~pL(wTcFBK