Advertisement
Guest User

Untitled

a guest
Jan 25th, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.43 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <deque>
  4. #include <vector>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. // dodać nagłówek przy princie do pliku, dodać dekompresje, ogarnac przesylanie tego co chlopaki zrobili do funkcji
  10. //bool* change_array_to_bool(Type array, int array_size){}
  11.  
  12. struct search_ptr {
  13. int length = 0;
  14. int index = -1;
  15. bool last_symbol;
  16. };
  17.  
  18. class LZ77_kompresja {
  19. private:
  20. int slownik_rozmiar;
  21. int rozmiar_tekstu;
  22. int bufor_wejsciowy_rozmiar = 128; //nie zmieniac tego, duzo zaleznych funkcji
  23. bool* text_start;
  24. bool* text_end;
  25. deque <bool> wejsciowy;
  26. deque <bool> slownik;
  27. deque <bool> output; //ready for binary write, header not included
  28. public:
  29. LZ77_kompresja(int slownik_rozmiar, bool* text_start, bool* text_end); //utworzenie i wypelnienie slownika
  30. bool completed_check();
  31. search_ptr search(); //szukanie ciagu, zwraca indeks w slowniku i dlugosc ciagu
  32. void scroll(int c);
  33. void next_step(int info_length);// przeszukanie, wpisanie na wyjscie, przesuniecie
  34. void save_info(search_ptr series, int info_length);
  35. void print_output_to_file();//include header and print .bssz file
  36. };
  37.  
  38. LZ77_kompresja::LZ77_kompresja(int slownik_rozmiar, bool* text_start, bool* text_end) {
  39. this-> slownik_rozmiar = slownik_rozmiar;
  40. this-> text_start = text_start;
  41. for (int i = 0; i < 128; i++) {
  42. wejsciowy.push_back(*text_start);
  43. text_start++;
  44. }
  45. for (int i = 0; i < slownik_rozmiar; i++) {
  46. slownik.push_back(wejsciowy.front());
  47. }
  48. }
  49.  
  50. bool LZ77_kompresja::completed_check() {
  51. if (text_start == text_end) return true;
  52. else return false;
  53. }
  54.  
  55. search_ptr LZ77_kompresja::search() { //wyszukiwanie naiwne
  56. search_ptr temp;
  57.  
  58. for (int i = 0; i < slownik_rozmiar; i++) {
  59. for (int j = 0; j < wejsciowy.size(); j++) {
  60. if (i + j > slownik_rozmiar - 2) break; // segfault protection, last
  61. if (slownik[i] != wejsciowy[j]) {
  62. if (j > temp.length) {
  63. temp.length = j;
  64. temp.index = i;
  65. temp.last_symbol = wejsciowy[j+1];
  66. }
  67. break;
  68. }
  69. }
  70. }
  71.  
  72. return temp;
  73. }
  74.  
  75. void LZ77_kompresja::scroll(int c) { //move all buffers c times to the left
  76. for (int i = 0; i < c; i++) {
  77. slownik.pop_front();
  78. slownik.push_back(wejsciowy.front());
  79. wejsciowy.pop_front();
  80. text_start++;
  81. if (text_start != text_end) {
  82. wejsciowy.push_back(*text_start);
  83. }
  84. }
  85. }
  86.  
  87. void LZ77_kompresja::save_info(search_ptr series, int pos_length) {//zapisz P, C, S binarnie
  88. //position
  89. int pos = series.index;
  90. vector<bool> vpos;
  91. while (pos > 0) {
  92. if (pos % 2 == 1) vpos.push_back(true);
  93. else vpos.push_back(false);
  94. }
  95. for (int i = 0; i < pos_length - vpos.size(); i++) {
  96. output.push_back(false);
  97. }
  98. for (int i = 0; i < vpos.size(); i++) {
  99. output.push_back(vpos[i]);
  100. }
  101. //count
  102. int count = series.length;
  103. vector<bool> vcount;
  104. while (count > 0) {
  105. if (count % 2 == 1) vcount.push_back(true);
  106. else vcount.push_back(false);
  107. }
  108. for (int i = 0; i < 7 - vcount.size(); i++) {
  109. output.push_back(false);
  110. }
  111. for (int i = 0; i < vcount.size(); i++) {
  112. output.push_back(vcount[i]);
  113. }
  114. //save one element after series
  115. output.push_back(series.last_symbol);
  116. }
  117.  
  118. void LZ77_kompresja::next_step(int pos_length) {
  119. search_ptr series = search(); //szukanie
  120. int przesuniecie = 0;
  121. if (series.length > (pos_length + 7) / 2) { //czy opłaca się zastąpić
  122. output.push_back(true); //znaleziono match, to slowo kodowe bedzie mialo dlugosc 1 + pos_length + 7 + 1 (czyli 9 + pos length bitów)
  123. save_info(series, pos_length);
  124. scroll(series.length + 1);//przesunięcie bufora
  125. }
  126. else {
  127. output.push_back(false); //nie znaleziono matcha, slowo ma dlugosc 1 + 1 (czyli 2 bity)
  128. output.push_back(wejsciowy.front());
  129. scroll(1);
  130. }
  131. }
  132.  
  133. void LZ77_kompresja::print_output_to_file() {
  134. fstream plik;
  135. plik.open("zkompresowany_obraz.bssz", ios::out | ios::binary);
  136.  
  137. for (int i = 0; i < output.size(); i++) {
  138. plik << output[i];
  139. }
  140. plik.close();
  141. }
  142.  
  143. void compress(int buffer_size_value, bool* text_start, bool* text_end) {
  144. int pos_length = 10;
  145. int power = 0;
  146. int temp = 1;
  147. while (temp < buffer_size_value) {
  148. power++;
  149. temp *= 2;
  150. }
  151. pos_length += power; //ilość bitów potrzebna do zapisania informacji o pozycji (liczba tych bitow moze sie zmieniac w zaleznosci od wyboru uzytkownika)
  152. int slownik_rozmiar = pow(2, pos_length);
  153.  
  154. bool* text_start; //bool tab pointer
  155. bool* text_end;
  156. LZ77_kompresja obj1(slownik_rozmiar, text_start, text_end);
  157. while (obj1.completed_check() == false) {
  158. obj1.next_step(pos_length);
  159. }
  160. obj1.print_output_to_file(); //dodać nagłówek
  161. }
  162. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  163.  
  164. class LZ77_dekompresja {//zaladowac plik do dwoch wektorow, wyciagnac z headera rozmiar bufora slownikowego, zrobic decode, zwrocic wektor
  165. private:
  166. vector<bool> file_header;
  167. vector<bool> file_pixel_info;
  168. int slownik_rozmiar;
  169. vector<bool> decoded_pixel_info;
  170. public:
  171. LZ77_dekompresja(vector<bool> file);
  172. void load_header();
  173. void load_pixel_info();
  174. void decode();
  175. };
  176.  
  177. LZ77_dekompresja::LZ77_dekompresja(vector<bool> file) {
  178.  
  179. }
  180.  
  181. vector<bool> decompress() {//zaladowac plik do dwoch wektorow, wyciagnac z headera rozmiar bufora slownikowego, zrobic decode, zwrocic wektor
  182. fstream plik;
  183. vector<bool> loaded;
  184. plik.open("zkompresowany_obraz.bssz", ios::in | ios::binary);
  185. //
  186. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement