Advertisement
KsaneK

huffman - lab

Jun 8th, 2017
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 22.60 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. #define BUFSIZE 1000
  5. #define SIZECRC 4
  6. #define kropka 46
  7. #define degreegen 32
  8.  
  9. int LICZBA_ZNAKOW;
  10.  
  11. struct galaz
  12. {
  13.        int ojciec;
  14.        int potomek1;
  15.        int potomek2;
  16. };
  17. struct galaz drzewo_kodowania[255];
  18.  
  19. struct element_kodu
  20. {
  21.        int symbol;
  22.        unsigned char slowo[4];
  23.        int liczba_bitow;
  24. };
  25.  
  26. struct element_kodu tablica_kodowania[512];
  27. struct element_kodu tablica_kodu[256];
  28.  
  29. struct symbol_zrodla
  30. {
  31.        int symbol;
  32.        int czestosc;
  33. };
  34. struct symbol_zrodla model_zrodla[256];
  35.  
  36.  
  37. int porownaj(const void *operand1,const void *operand2)
  38. {
  39.     const struct symbol_zrodla *pointer1 = (const struct symbol_zrodla*) operand1;
  40.     const struct symbol_zrodla *pointer2 = (const struct symbol_zrodla*) operand2;
  41.     if((pointer1->czestosc)==(pointer2->czestosc)) return 0;
  42.     else if((pointer1->czestosc)<(pointer2->czestosc))return 1;
  43.     else return -1;
  44. }
  45.  
  46. int nazwa_pliku(char *nazwa_pliku, char *rozszerzenie, char *nazwa_pliku_nowa)
  47. {
  48.     int i,n;
  49.     char *w_nazwy;
  50.  
  51.     for (n=0; n<24; n++)
  52.        nazwa_pliku_nowa[n]=0;
  53.  
  54.     n=0;
  55.     w_nazwy=nazwa_pliku;
  56.     nazwa_pliku_nowa[n]=*w_nazwy;
  57.     while ((nazwa_pliku_nowa[n]!=kropka)&&(nazwa_pliku_nowa[n]!='\0'))
  58.     {
  59.         n++;
  60.         w_nazwy++;
  61.         nazwa_pliku_nowa[n]=*w_nazwy;
  62.     }
  63.     n++;
  64.     i=0;
  65.     nazwa_pliku_nowa[n]=rozszerzenie[i];
  66.     while (rozszerzenie[i]!='\0')
  67.     {
  68.         n++;
  69.         i++;
  70.         nazwa_pliku_nowa[n]=rozszerzenie[i];
  71.     }
  72.     return 0;
  73. }
  74.  
  75.  
  76. int wyznacz_model(char *nazwa_plik_dany, struct symbol_zrodla model_zrodla[])
  77. {
  78.     int n;
  79.     int indeks = 0;
  80.     int lwz = 0;
  81.     int licznik_symboli_zrodla=0;
  82.     struct symbol_zrodla model_pelny[256];
  83.  
  84.     unsigned char bufor_wejscia[BUFSIZE];
  85.  
  86.     for(int k=0; k<256; k++)
  87.     {
  88.      model_pelny[k].symbol=k;
  89.      model_pelny[k].czestosc=0;
  90.     }
  91.  
  92.  
  93.     FILE *wskaznik_pliku=NULL;
  94.     wskaznik_pliku=fopen(nazwa_plik_dany,"rb");
  95.  
  96.     if (wskaznik_pliku == NULL)
  97.     {
  98.         printf("Nie mozna otworzyc pliku: %s  \n", nazwa_plik_dany);
  99.         exit(EXIT_FAILURE);
  100.     }
  101.     else
  102.     //wczytuje dane z pliku blokami i wyznacza czêstoœci wystêpowania znaków
  103.     {
  104.     printf( "Czytanie pliku %s do wyznaczenia modelu. \n", nazwa_plik_dany);
  105.     while(n=fread(bufor_wejscia,sizeof(unsigned char),BUFSIZE,wskaznik_pliku))
  106.     {
  107.           for(int i=0; i<n; i++)
  108.           {
  109.             indeks = bufor_wejscia[i];
  110.             model_pelny[indeks].czestosc++;
  111.           }
  112.             lwz+=n;
  113.     }
  114.     printf("liczba wszystkich znakow w pliku: %d\n", lwz);
  115.     }
  116.  
  117.     LICZBA_ZNAKOW = lwz;
  118.  
  119.     for(int i=0; i<256; i++)
  120.       {
  121.             if (model_pelny[i].czestosc!=0)
  122.             {
  123.                model_zrodla[licznik_symboli_zrodla].symbol=model_pelny[i].symbol;
  124.                model_zrodla[licznik_symboli_zrodla].czestosc=model_pelny[i].czestosc;
  125.                licznik_symboli_zrodla++;
  126.              }
  127.        }
  128.     return (licznik_symboli_zrodla);
  129. }
  130.  
  131. int sortuj_model(struct symbol_zrodla model_zrodla[],int liczba_symboli_modelu,char *nazwapliku_msort)
  132. {
  133.     return 0;
  134. }
  135.  
  136. int zrob_drzewo(struct symbol_zrodla model_zrodla[], struct galaz drzewo_kodowania[],int liczba_symboli_modelu)
  137. {
  138.     int liczba_symboli = liczba_symboli_modelu;
  139.     int licznik_symboli;
  140.     int licznik_symboli_dodanych = 0;
  141.     int n;
  142.  
  143.  
  144.     licznik_symboli=liczba_symboli;
  145.     for(int k=0; k<liczba_symboli-1; k++)
  146.     {
  147.         drzewo_kodowania[k].ojciec = 256+k;
  148.         drzewo_kodowania[k].potomek1 = model_zrodla[liczba_symboli_modelu-1-k].symbol;
  149.         drzewo_kodowania[k].potomek2 = model_zrodla[liczba_symboli_modelu-2-k].symbol;
  150.         model_zrodla[liczba_symboli_modelu-2-k].symbol = 256+k;
  151.         model_zrodla[liczba_symboli_modelu-2-k].czestosc = model_zrodla[liczba_symboli_modelu-1-k].czestosc + model_zrodla[liczba_symboli_modelu-2-k].czestosc;
  152.         licznik_symboli--;
  153.         qsort(model_zrodla,licznik_symboli,sizeof(struct symbol_zrodla), porownaj);
  154.         licznik_symboli_dodanych++;
  155.     }
  156.     return (licznik_symboli_dodanych);
  157. }
  158.  
  159. int daj_tablice_kodowania(struct galaz drzewo_kodowania[], struct element_kodu tablica_kodowania[],int liczba_symboli_modelu)
  160. {
  161.     int symbol1,symbol2;
  162.     int n, indeks_ojca, symbol_ojca;
  163.     int licznik_drzewa=liczba_symboli_modelu-2;
  164.     int licznik_kodu=0;
  165.     int dlugosc_ciagu=0;
  166.     int pozycja, ktory_bajt, ktory_bit;
  167.     unsigned char bajt, bajtek[4], jedynka=1;
  168.  
  169.     for(int k=0; k<2*liczba_symboli_modelu; k++)
  170.     {
  171.       for(int i=0; i<4; i++)
  172.           tablica_kodowania[k].slowo[i]=0;
  173.       tablica_kodowania[k].symbol=0;
  174.       tablica_kodowania[k].liczba_bitow=0;
  175.     }
  176.  
  177.      tablica_kodowania[licznik_kodu].symbol=drzewo_kodowania[licznik_drzewa].ojciec;
  178.      while(licznik_drzewa+1)
  179.      {
  180.           symbol_ojca=drzewo_kodowania[licznik_drzewa].ojciec;
  181.           tablica_kodowania[licznik_kodu+1].symbol=drzewo_kodowania[licznik_drzewa].potomek1;
  182.           tablica_kodowania[licznik_kodu+2].symbol=drzewo_kodowania[licznik_drzewa].potomek2;
  183.  
  184.           indeks_ojca=-1;
  185.           for (int i=0; i<licznik_kodu+1; i++)
  186.              {
  187.                //printf("%d  %d  %d\n", licznik_drzewa, symbol_ojca, tablica_kodowania[i].symbol);
  188.                if ((tablica_kodowania[i].symbol)==(symbol_ojca))
  189.                 {
  190.                  indeks_ojca=i;
  191.                  break;
  192.                 }
  193.              }
  194.              if (indeks_ojca==-1)
  195.              {
  196.                  printf("Blad tworzenie tablicy kodowania\n");
  197.                  exit(EXIT_FAILURE);
  198.              }
  199.  
  200.           dlugosc_ciagu=tablica_kodowania[indeks_ojca].liczba_bitow;
  201.           //Przepisanie ciagu ojca do potomkow
  202.           for (int i=0; i<4; i++)
  203.                 {
  204.                 tablica_kodowania[licznik_kodu+1].slowo[i]=tablica_kodowania[indeks_ojca].slowo[i];
  205.                 tablica_kodowania[licznik_kodu+2].slowo[i]=tablica_kodowania[indeks_ojca].slowo[i];
  206.  
  207.                 }
  208.  
  209.           pozycja=dlugosc_ciagu;
  210.           ktory_bajt=pozycja/8;
  211.           ktory_bit=pozycja%8;
  212.           jedynka=1;
  213.           jedynka=jedynka<<7-ktory_bit;
  214.  
  215.           bajt=tablica_kodowania[indeks_ojca].slowo[ktory_bajt];
  216.           bajt=bajt|jedynka;//dopisanie jedynki
  217.  
  218.           tablica_kodowania[licznik_kodu+1].slowo[ktory_bajt]=bajt;
  219.           tablica_kodowania[licznik_kodu+1].liczba_bitow=dlugosc_ciagu+1;
  220.           tablica_kodowania[licznik_kodu+2].liczba_bitow=dlugosc_ciagu+1;
  221.           licznik_kodu+=2;
  222.           licznik_drzewa--;
  223.      }
  224.     return 0;
  225. }
  226.  
  227. int daj_tablice_kodu(struct element_kodu tablica_kodowania[], struct element_kodu tablica_kodu[],int liczba_symboli_modelu)
  228. {
  229.     int symbol, licznik_kodu=0;
  230.     unsigned char bajtek[4];
  231.  
  232.      for (int k=0; k<2*liczba_symboli_modelu-1; k++)
  233.      {
  234.          symbol=tablica_kodowania[k].symbol;
  235.          if (symbol<256)
  236.          {
  237.              tablica_kodu[licznik_kodu].symbol=symbol;
  238.              tablica_kodu[licznik_kodu].liczba_bitow=tablica_kodowania[k].liczba_bitow;
  239.              for (int i=0; i<4; i++)
  240.                 tablica_kodu[licznik_kodu].slowo[i]=tablica_kodowania[k].slowo[i];
  241.              licznik_kodu++;
  242.          }
  243.      }
  244.     return 0;
  245. }
  246.  
  247. int kompresja(char *nazwa_pliku_in, char *nazwa_pliku_out, struct element_kodu tablica_kodu[],int liczba_symboli_modelu)
  248. {
  249.  
  250.     unsigned char bufor_wejscia[BUFSIZE];
  251.     unsigned char bufor_wyjscia[BUFSIZE];
  252.     unsigned char symbol, dopisek, bajt_out;
  253.     int n,suma=0;
  254.     int licznik_symboli_kodowanych;
  255.     int kursor_slowka, kursor_out;//pozycja bitu w slowie kodowym, pozycja bitu w bajcie out
  256.     int liczba_bit_skod, liczba_wolne_bity, liczba_pozostale_w_slowku, numer_bajtu, numer_slowka;
  257.     unsigned char maska1, maska2, maska, slowko[4];
  258.  
  259.     FILE *wskaznik_pliku_out=NULL;
  260.     wskaznik_pliku_out=fopen(nazwa_pliku_out,"wb");
  261.  
  262.     if (wskaznik_pliku_out == NULL)
  263.     {
  264.         printf("Nie mozna otworzyc pliku: %s  \n", nazwa_pliku_in);
  265.         exit(EXIT_FAILURE);
  266.     }
  267.  
  268.  
  269.     FILE *wskaznik_pliku_in=NULL;
  270.     wskaznik_pliku_in=fopen(nazwa_pliku_in,"rb");
  271.  
  272.     if (wskaznik_pliku_in == NULL)
  273.     {
  274.         printf("Nie mozna otworzyc pliku: %s  \n", nazwa_pliku_in);
  275.         exit(EXIT_FAILURE);
  276.     }
  277.     numer_slowka=0;
  278.     numer_bajtu=0;
  279.     kursor_out=0;
  280.     bajt_out=0;
  281.     licznik_symboli_kodowanych=0;
  282.  
  283.     while(n=fread(bufor_wejscia,sizeof(unsigned char),BUFSIZE,wskaznik_pliku_in))
  284.     {
  285.     for(int i=0; i<n; i++)
  286.       {
  287.         symbol = bufor_wejscia[i];
  288.         for (int m=0; m<liczba_symboli_modelu; m++)
  289.         {
  290.           if (symbol==tablica_kodu[m].symbol)
  291.            {
  292.            for (int k=0; k<4; k++)
  293.              slowko[k]=tablica_kodu[m].slowo[k];
  294.            liczba_bit_skod=tablica_kodu[m].liczba_bitow;
  295.            suma=suma+liczba_bit_skod;
  296.            kursor_slowka=0;
  297.            numer_slowka=0;
  298.            break;
  299.            }
  300.         }
  301.         while (liczba_bit_skod>0)
  302.         {
  303.            liczba_pozostale_w_slowku=8-kursor_slowka;
  304.            if (liczba_pozostale_w_slowku>liczba_bit_skod)
  305.               liczba_pozostale_w_slowku=liczba_bit_skod;
  306.            liczba_wolne_bity=8-kursor_out;
  307.            if (liczba_pozostale_w_slowku<liczba_wolne_bity)
  308.                liczba_wolne_bity=liczba_pozostale_w_slowku;
  309.            maska1=255>>kursor_slowka;
  310.            maska2=255<<(8-(kursor_slowka+liczba_wolne_bity));
  311.            maska=maska1&maska2;
  312.            dopisek=slowko[numer_slowka]&maska;
  313.            dopisek=dopisek<<kursor_slowka;
  314.            dopisek=dopisek>>kursor_out;
  315.            bajt_out=bajt_out|dopisek;
  316.            kursor_out+=liczba_wolne_bity;
  317.            liczba_bit_skod-=liczba_wolne_bity;
  318.            kursor_slowka+=liczba_wolne_bity;
  319.            liczba_pozostale_w_slowku-=liczba_wolne_bity;
  320.            if (liczba_pozostale_w_slowku==0)
  321.            {
  322.              numer_slowka++;
  323.              kursor_slowka=0;
  324.              if (liczba_bit_skod>=8)
  325.              liczba_pozostale_w_slowku=8;
  326.              else
  327.              liczba_pozostale_w_slowku=liczba_bit_skod;
  328.            }
  329.            if (kursor_out==8)
  330.            {
  331.            fwrite(&bajt_out,sizeof(unsigned char),1,wskaznik_pliku_out);
  332.            numer_bajtu++;
  333.            kursor_out=0;
  334.            bajt_out=0;
  335.            }
  336.          }
  337.          licznik_symboli_kodowanych+=1;
  338.        }
  339.     }
  340.  
  341.     printf("Bajt wyjsciowy numer %d  kod hdec  %x  \n", numer_bajtu, bajt_out);
  342.     fwrite(&bajt_out,sizeof(unsigned char),1,wskaznik_pliku_out);
  343.  
  344.     printf("Liczba zakodowanych znakow pliku kompresowanego: %d\n", licznik_symboli_kodowanych);
  345.     printf("Liczba bajtow w pliku skompresowanym: %d\n", numer_bajtu+1);
  346.     printf("Wskaznik upakowania: %5.1f  procent\n", 100*(float)(numer_bajtu+1)/(float)licznik_symboli_kodowanych);
  347.     fclose(wskaznik_pliku_in);
  348.     fclose(wskaznik_pliku_out);
  349.  
  350.     return (suma);
  351. }
  352.  
  353. int dekompresja(char *nazwa_pliku_skom, char *nazwa_pliku_dekom, struct galaz drzewo_kodowania[], int liczba_galezi_drzewa, int ile_symboli)
  354. {
  355.     unsigned char bajt_out, bit1, bajt_in;
  356.     int m,n,suma_symboli=0,suma_bitow=0;
  357.     int indeks_drzewa;
  358.     int kursor_in;//pozycja bitu w bajcie wejsciowym
  359.     int pater, syn1, syn0;;
  360.     unsigned char maska=128;
  361.  
  362.     FILE *wskaznik_pliku_skom=NULL;
  363.     wskaznik_pliku_skom=fopen(nazwa_pliku_skom,"rb");
  364.  
  365.     if (wskaznik_pliku_skom == NULL)
  366.     {
  367.         printf("Nie mozna otworzyc pliku: %s  \n", nazwa_pliku_skom);
  368.         exit(EXIT_FAILURE);
  369.     }
  370.  
  371.  
  372.     FILE *wskaznik_pliku_dekom=NULL;
  373.     wskaznik_pliku_dekom=fopen(nazwa_pliku_dekom,"wb");
  374.  
  375.     if (wskaznik_pliku_dekom == NULL)
  376.     {
  377.         printf("Nie mozna otworzyc pliku: %s  \n", nazwa_pliku_dekom);
  378.         exit(EXIT_FAILURE);
  379.     }
  380.  
  381.     printf( "Czytanie pliku skompresowanego %s po jednym bajcie. \n", nazwa_pliku_skom);
  382.     printf( "Po zdekodowaniu pisanie bajtu do pliku %s. \n", nazwa_pliku_dekom);
  383.  
  384.     suma_symboli=0;
  385.     indeks_drzewa=liczba_galezi_drzewa-1;
  386.     pater=drzewo_kodowania[indeks_drzewa].ojciec;
  387.     syn1=drzewo_kodowania[indeks_drzewa].potomek1;
  388.     syn0=drzewo_kodowania[indeks_drzewa].potomek2;
  389.  
  390.     //printf("Tyle ma byc bajtow po zdekodowaniu:  %d a tyle zdekodowano: %d\n", ile_bajtow, suma_symboli);
  391.  
  392.     while(suma_symboli<ile_symboli)
  393.     {
  394.     //printf("Tyle ma byc bajtow:  %d a tyle juz zdekodowano: %d\n", ile_bajtow, suma_symboli);
  395.     n=fread(&bajt_in,sizeof(unsigned char),1,wskaznik_pliku_skom);
  396.     if (n==1)
  397.       {
  398.         for (int k=0;k<8; k++)
  399.         {
  400.             bit1=bajt_in&maska;
  401.             //printf("Galaz %d %d %d  bajt_in %x bit1 %x\n",pater, syn1, syn0, bajt_in, bit1);
  402.             bajt_in=bajt_in<<1;
  403.             suma_bitow++;
  404.             if (bit1)
  405.               pater=syn1;
  406.             else
  407.               pater=syn0;
  408.  
  409.             if (pater<256)
  410.             {
  411.                bajt_out=pater;
  412.                //printf("Galaz %d %d %d symbol %d\n",pater, syn1, syn0, bajt_out);
  413.                fwrite(&bajt_out,sizeof(unsigned char),1,wskaznik_pliku_dekom);
  414.                suma_symboli++;
  415.                indeks_drzewa=liczba_galezi_drzewa-1;
  416.                pater=drzewo_kodowania[indeks_drzewa].ojciec;
  417.                syn1=drzewo_kodowania[indeks_drzewa].potomek1;
  418.                syn0=drzewo_kodowania[indeks_drzewa].potomek2;
  419.                if (suma_symboli == ile_symboli)
  420.                break;//wyjscie z for
  421.             }
  422.             else
  423.             {
  424.             m=liczba_galezi_drzewa-1;
  425.             while (m>=0)
  426.             {
  427.                if  (drzewo_kodowania[m].ojciec==pater)
  428.                {
  429.                  indeks_drzewa=m;
  430.                  m=-1;
  431.                }
  432.                m=m-1;
  433.             }
  434.             //pater=drzewo_kodowania[indeks_drzewa].ojciec;
  435.             syn1=drzewo_kodowania[indeks_drzewa].potomek1;
  436.             syn0=drzewo_kodowania[indeks_drzewa].potomek2;
  437.             }//end else
  438.           }//end for
  439.         } //end if
  440.       }//end while
  441.  
  442.       printf("Liczba odczytanych bitow: %d, liczba zdekodowanych symboli %d.\n", suma_bitow, suma_symboli);
  443.       fclose(wskaznik_pliku_skom);
  444.       fclose(wskaznik_pliku_dekom);
  445.  
  446.       return (suma_symboli);
  447. }
  448.  
  449. int dzielenie(char *nazwa_pliku_in, unsigned char reszta[], unsigned char wielomian[])
  450. {
  451.  unsigned char bufor_wejscia[BUFSIZE], kolejka[SIZECRC+BUFSIZE];
  452.  unsigned char start=0, koniec=0, maska=128, ostatni_bit, pierwszy_bit;
  453.  int n,m;
  454.  int licznik_bitow=0;
  455.  int licznik_bajtow_in=0, licznik_buforu=0;
  456.  
  457.     for (int i=0; i<SIZECRC; i++)
  458.        reszta[i]=0;
  459.  
  460.     for (int i=0; i<SIZECRC+BUFSIZE; i++)
  461.        kolejka[i]=0;
  462.  
  463.     FILE *wskaznik_pliku_in=NULL;
  464.     wskaznik_pliku_in=fopen(nazwa_pliku_in,"rb");
  465.  
  466.     if (wskaznik_pliku_in == NULL)
  467.     {
  468.       printf("Nie mozna otworzyc pliku: %s  \n", nazwa_pliku_in);
  469.       exit(EXIT_FAILURE);
  470.     }
  471.  
  472.     while(n=fread(bufor_wejscia,sizeof(unsigned char),BUFSIZE,wskaznik_pliku_in))
  473.     {
  474.         //printf("Return fread %d\n",n);
  475.         for (int i=0; i<n; i++)
  476.                   kolejka[SIZECRC+i]=bufor_wejscia[i];
  477.         licznik_bitow=8*n;
  478.         licznik_bajtow_in+=n;
  479.  
  480.         while (licznik_bitow)
  481.         {
  482.           licznik_buforu=1+(licznik_bitow-1)/8;
  483.           //printf("Liczba bitow %d. Licznik buforu %d. \n", licznik_bitow, licznik_buforu);
  484.           pierwszy_bit=maska&kolejka[0];
  485.  
  486.           for (int i=0; i<SIZECRC+licznik_buforu; i++)
  487.                {
  488.                  kolejka[i]=(kolejka[i]<<1);
  489.                  ostatni_bit=kolejka[i+1]>>7;
  490.                  kolejka[i]=kolejka[i]|ostatni_bit;
  491.                  //printf("Bajt %d kolejki po przesunieciu: %#x\n", i, kolejka[i]);
  492.                }
  493.           if (pierwszy_bit!=0)  //jesli pierwszy bit jest jedynka
  494.                for(int i=0; i<SIZECRC; i++)
  495.                   {
  496.                     kolejka[i]=kolejka[i]^wielomian[i];
  497.                     //printf("Bajt %d kolejki po xorowaniu: %#x\n", i, kolejka[i]);
  498.                   }
  499.           licznik_bitow--;
  500.  
  501.         } // end while
  502.     } // end while
  503.  
  504.     //printf("Sukcesywne dopisywanie degreegen zer na koncu kolejki.\n");
  505.     licznik_bitow=degreegen;
  506.  
  507.         while (licznik_bitow>0)
  508.         {
  509.           //printf("Liczba bitow %d\n", licznik_bitow);
  510.  
  511.           pierwszy_bit=maska&kolejka[0];
  512.           //printf("Pierwszy bit %#x\n", pierwszy_bit);
  513.           for (int i=0; i<SIZECRC; i++)
  514.                {
  515.                  kolejka[i]=(kolejka[i]<<1);
  516.                  ostatni_bit=kolejka[i+1]>>7;
  517.                  kolejka[i]=kolejka[i]|ostatni_bit;
  518.                }
  519.               //for(int i=0; i<SIZECRC+n; i++)
  520.               //   printf("Po przesunieciu bajt %d kolejki: %#x\n", i, kolejka[i]);
  521.           //Zero na koncu jest dopisywane z definicji przesuniecia
  522.           if (pierwszy_bit!=0)  //jesli pierwszy bit jest jedynka
  523.                  for(int i=0; i<SIZECRC; i++)
  524.                  {
  525.                     kolejka[i]=kolejka[i]^wielomian[i];
  526.                     //printf("Bajt %d kolejki po xorowaniu: %#x\n", i, kolejka[i]);
  527.                  }
  528.           licznik_bitow--;
  529.  
  530.         }// end while
  531.  
  532.  for(int i=0; i<SIZECRC; i++)
  533.       reszta[i]=kolejka[i];
  534.  
  535.  return licznik_bajtow_in;
  536.  
  537. }
  538. void copyFile(char *from, char *to)
  539. {
  540.     FILE * input;
  541.     FILE * output;
  542.  
  543.     if((input = fopen(from, "rb")) == NULL)
  544.     {
  545.         perror("Nie mozna otworzyc pliku");
  546.         exit(EXIT_FAILURE);
  547.     }
  548.  
  549.     if((output = fopen(to, "wb")) == NULL)
  550.     {
  551.         perror("Nie mozna otworzyc pliku");
  552.         exit(EXIT_FAILURE);
  553.     }
  554.  
  555.     int c;
  556.     do
  557.     {
  558.         c = fgetc(input);
  559.         if( feof(input) )
  560.         {
  561.             break ;
  562.         }
  563.         fputc(c, output);
  564.     }while(1);
  565.  
  566.     if(fclose(input) != 0)
  567.     {
  568.         perror("fclose");
  569.         exit(EXIT_FAILURE);
  570.     }
  571.  
  572.     if(fclose(output) != 0)
  573.     {
  574.         perror("fclose");
  575.         exit(EXIT_FAILURE);
  576.     }
  577. }
  578.  
  579. void appendCrcToFile(char * outputWithCrc, int crcSizeInBytes, unsigned char crc[])
  580. {
  581.  
  582.     FILE * output;
  583.  
  584.     if((output = fopen(outputWithCrc, "a")) == NULL)
  585.     {
  586.         perror("Nie mozna otworzyc pliku");
  587.         exit(EXIT_FAILURE);
  588.     }
  589.  
  590.     int c;
  591.     int i;
  592.  
  593.     for(i=0; i<SIZECRC; i++)
  594.     {
  595.         c = crc[i];
  596.         fputc(c, output);
  597.     }
  598.  
  599.     if(fclose(output) != 0)
  600.     {
  601.         perror("fclose");
  602.         exit(EXIT_FAILURE);
  603.     }
  604. }
  605.  
  606. void createCrcFile(char * fileName, int crcSizeInBytes, unsigned char crc[])
  607. {
  608.  
  609.     FILE * fp;
  610.  
  611.     if((fp = fopen(fileName, "wb")) == NULL)
  612.     {
  613.         perror("Nie mozna otworzyc pliku");
  614.         exit(EXIT_FAILURE);
  615.     }
  616.  
  617.     int c;
  618.     int i;
  619.     for(i=0; i<SIZECRC; i++)
  620.     {
  621.         c = crc[i];
  622.         fputc(c, fp);
  623.     }
  624.     if(fclose(fp) != 0)
  625.     {
  626.         perror("fclose");
  627.         exit(EXIT_FAILURE);
  628.     }
  629. }
  630.  
  631. int isIntegral(unsigned char rest[], int restSize){
  632.  
  633.     int i=0;
  634.     for(i=0; i<restSize; i++){
  635.         if(rest[i] != 0){
  636. //            printf("Integrity check failed");
  637.             return 0;
  638.         }
  639.     }
  640.     return 1;
  641. }
  642.  
  643. int main(int argc, char *argv[])
  644. {
  645.     int n;
  646.     int liczba_symboli_modelu=0;
  647.     int liczba_symboli_dodanych=0;
  648.     char *nazwa_pliku_in;
  649.     char rozszerzenie_out[]= "huffman";
  650.     char rozszerzenie_decoded[]= "decoded";
  651.     char CRC_rozszerzenie[]= "CRC";
  652.     char nazwa_CRC[24];
  653.     char nazwa_modelu[24];
  654.     char nazwa_modsort[24];
  655.     char nazwa_pliku_out[24];
  656.     char nazwa_pliku_decoded[24];
  657.     unsigned char wielomian[SIZECRC], reszta[SIZECRC];
  658.     int ile_bajtow_zrobiono;
  659.  
  660.     wielomian[0]=0x00;
  661.     wielomian[1]=0x00;
  662.     wielomian[2]=0x00;
  663.     wielomian[3]=0x0b;
  664.  
  665.     if(argc==2)
  666.     {
  667.         nazwa_pliku_in=argv[1];
  668.         printf("Nazwa pliku do kompresji:  %s \n", nazwa_pliku_in);
  669.     }
  670.     else
  671.     {
  672.         printf("Zla liczba parametrow.  ","%d", argc);
  673.         exit(EXIT_FAILURE);
  674.     }
  675.     for (int i=0; i<SIZECRC; i++)
  676.         printf("Wartosc %d. bajtu wielomianu to: %02x\n", i+1, wielomian[i]);
  677.     n=nazwa_pliku(nazwa_pliku_in, CRC_rozszerzenie,nazwa_CRC);
  678.     n=dzielenie(nazwa_pliku_in, reszta, wielomian);
  679.     createCrcFile(nazwa_CRC, SIZECRC, reszta);
  680.     appendCrcToFile(nazwa_pliku_in, SIZECRC, reszta);
  681.  
  682.     liczba_symboli_modelu = wyznacz_model(nazwa_pliku_in, model_zrodla);
  683.  
  684.     if (liczba_symboli_modelu!=0)
  685.         printf("Liczba symboli alfabetu wejsciowego: %d\n", liczba_symboli_modelu);
  686.     else
  687.     {
  688.         printf("Wyznaczanie modelu zrodla nie powiodlo sie.\n");
  689.         exit(EXIT_FAILURE);
  690.     }
  691.  
  692.     n = sortuj_model(model_zrodla,liczba_symboli_modelu, nazwa_modsort);
  693.     if (n==0)
  694.      printf("Model zrodla zostal posortowany\n");
  695.     else
  696.     {
  697.      printf("Sortowanie modelu zrodla nie powiodlo sie.\n");
  698.      exit(EXIT_FAILURE);
  699.     }
  700.     liczba_symboli_dodanych=zrob_drzewo(model_zrodla,drzewo_kodowania,liczba_symboli_modelu);
  701.     if (liczba_symboli_dodanych!=0)
  702.      printf("Liczba symboli dodanych: %d\n", liczba_symboli_dodanych);
  703.     else
  704.     {
  705.      printf("Utworzenie drzewa kodowania nie powiodlo sie.\n");
  706.      exit(EXIT_FAILURE);
  707.     }
  708.     n = daj_tablice_kodowania(drzewo_kodowania, tablica_kodowania, liczba_symboli_modelu);
  709.     if (n==0)
  710.      printf("Tablica kodowania zostala utworzona.\n");
  711.     else
  712.     {
  713.      printf("Utworzenie tablicy kodowania nie powiodlo sie.\n");
  714.      exit(EXIT_FAILURE);
  715.     }
  716.     n = daj_tablice_kodu( tablica_kodowania, tablica_kodu,liczba_symboli_modelu);
  717.     if (n==0)
  718.      printf("Tablica kodu zostala utworzona.\n");
  719.     else
  720.     {
  721.      printf("Utworzenie tablicy kodu nie powiodlo sie.\n");
  722.      exit(EXIT_FAILURE);
  723.     }
  724.     n=nazwa_pliku(nazwa_pliku_in, rozszerzenie_out,nazwa_pliku_out);
  725.     n=kompresja(nazwa_pliku_in, nazwa_pliku_out, tablica_kodu,liczba_symboli_modelu);
  726.  
  727.     if (n>0)
  728.     {
  729.       printf("Suma bitow kodu w pliku %s  %d  \n", nazwa_pliku_out, n);
  730.       if (n%8!=0)
  731.         n=n/8+1;
  732.       printf("Liczba bajtow w pliku %s  %d  \n", nazwa_pliku_out, n);
  733.     }
  734.     else
  735.     {
  736.         printf("Kodowanie nie powiodlo sie.\n");
  737.         exit(EXIT_FAILURE);
  738.     }
  739.     n=nazwa_pliku(nazwa_pliku_in, rozszerzenie_decoded,nazwa_pliku_decoded);
  740.     printf("\nDEKODOWANIE\n\n");
  741.     printf("Tyle bajtow nalezy odkodowac: %d\n", LICZBA_ZNAKOW);
  742.     ile_bajtow_zrobiono=dekompresja(nazwa_pliku_out, nazwa_pliku_decoded,drzewo_kodowania,liczba_symboli_dodanych, LICZBA_ZNAKOW);
  743.     if (ile_bajtow_zrobiono==LICZBA_ZNAKOW)
  744.       printf("Liczba bajtow prawidlowa. Wynik dekompresji zapisany do pliku: %s. \n\n\n", nazwa_pliku_decoded);
  745.     else
  746.       printf("Liczba bajtow nieprawidlowa. Wynik dekompresji zapisany do pliku: %s. \n\n\n", nazwa_pliku_decoded);
  747.     n=dzielenie(nazwa_pliku_decoded, reszta, wielomian);
  748.     if(isIntegral(reszta, SIZECRC)) printf("Zdekodowano poprawnie. CRC prawidlowe");
  749.     else printf("Zdekodowano niepoprawnie. CRC nieprawidlowe");
  750.     return 0;
  751. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement