Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "pch.h"
- #include <iostream>
- #include <deque>
- #include <vector>
- #include <fstream>
- using namespace std;
- // dodać nagłówek przy princie do pliku, dodać dekompresje, ogarnac przesylanie tego co chlopaki zrobili do funkcji
- //bool* change_array_to_bool(Type array, int array_size){}
- struct search_ptr {
- int length = 0;
- int index = -1;
- bool last_symbol;
- };
- class LZ77_kompresja {
- private:
- int slownik_rozmiar;
- int rozmiar_tekstu;
- int bufor_wejsciowy_rozmiar = 128; //nie zmieniac tego, duzo zaleznych funkcji
- bool* text_start;
- bool* text_end;
- deque <bool> wejsciowy;
- deque <bool> slownik;
- deque <bool> output; //ready for binary write, header not included
- public:
- LZ77_kompresja(int slownik_rozmiar, bool* text_start, bool* text_end); //utworzenie i wypelnienie slownika
- bool completed_check();
- search_ptr search(); //szukanie ciagu, zwraca indeks w slowniku i dlugosc ciagu
- void scroll(int c);
- void next_step(int info_length);// przeszukanie, wpisanie na wyjscie, przesuniecie
- void save_info(search_ptr series, int info_length);
- void print_output_to_file();//include header and print .bssz file
- };
- LZ77_kompresja::LZ77_kompresja(int slownik_rozmiar, bool* text_start, bool* text_end) {
- this-> slownik_rozmiar = slownik_rozmiar;
- this-> text_start = text_start;
- for (int i = 0; i < 128; i++) {
- wejsciowy.push_back(*text_start);
- text_start++;
- }
- for (int i = 0; i < slownik_rozmiar; i++) {
- slownik.push_back(wejsciowy.front());
- }
- }
- bool LZ77_kompresja::completed_check() {
- if (text_start == text_end) return true;
- else return false;
- }
- search_ptr LZ77_kompresja::search() { //wyszukiwanie naiwne
- search_ptr temp;
- for (int i = 0; i < slownik_rozmiar; i++) {
- for (int j = 0; j < wejsciowy.size(); j++) {
- if (i + j > slownik_rozmiar - 2) break; // segfault protection, last
- if (slownik[i] != wejsciowy[j]) {
- if (j > temp.length) {
- temp.length = j;
- temp.index = i;
- temp.last_symbol = wejsciowy[j+1];
- }
- break;
- }
- }
- }
- return temp;
- }
- void LZ77_kompresja::scroll(int c) { //move all buffers c times to the left
- for (int i = 0; i < c; i++) {
- slownik.pop_front();
- slownik.push_back(wejsciowy.front());
- wejsciowy.pop_front();
- text_start++;
- if (text_start != text_end) {
- wejsciowy.push_back(*text_start);
- }
- }
- }
- void LZ77_kompresja::save_info(search_ptr series, int pos_length) {//zapisz P, C, S binarnie
- //position
- int pos = series.index;
- vector<bool> vpos;
- while (pos > 0) {
- if (pos % 2 == 1) vpos.push_back(true);
- else vpos.push_back(false);
- }
- for (int i = 0; i < pos_length - vpos.size(); i++) {
- output.push_back(false);
- }
- for (int i = 0; i < vpos.size(); i++) {
- output.push_back(vpos[i]);
- }
- //count
- int count = series.length;
- vector<bool> vcount;
- while (count > 0) {
- if (count % 2 == 1) vcount.push_back(true);
- else vcount.push_back(false);
- }
- for (int i = 0; i < 7 - vcount.size(); i++) {
- output.push_back(false);
- }
- for (int i = 0; i < vcount.size(); i++) {
- output.push_back(vcount[i]);
- }
- //save one element after series
- output.push_back(series.last_symbol);
- }
- void LZ77_kompresja::next_step(int pos_length) {
- search_ptr series = search(); //szukanie
- int przesuniecie = 0;
- if (series.length > (pos_length + 7) / 2) { //czy opłaca się zastąpić
- output.push_back(true); //znaleziono match, to slowo kodowe bedzie mialo dlugosc 1 + pos_length + 7 + 1 (czyli 9 + pos length bitów)
- save_info(series, pos_length);
- scroll(series.length + 1);//przesunięcie bufora
- }
- else {
- output.push_back(false); //nie znaleziono matcha, slowo ma dlugosc 1 + 1 (czyli 2 bity)
- output.push_back(wejsciowy.front());
- scroll(1);
- }
- }
- void LZ77_kompresja::print_output_to_file() {
- fstream plik;
- plik.open("zkompresowany_obraz.bssz", ios::out | ios::binary);
- for (int i = 0; i < output.size(); i++) {
- plik << output[i];
- }
- plik.close();
- }
- void compress(int buffer_size_value, bool* text_start, bool* text_end) {
- int pos_length = 10;
- int power = 0;
- int temp = 1;
- while (temp < buffer_size_value) {
- power++;
- temp *= 2;
- }
- pos_length += power; //ilość bitów potrzebna do zapisania informacji o pozycji (liczba tych bitow moze sie zmieniac w zaleznosci od wyboru uzytkownika)
- int slownik_rozmiar = pow(2, pos_length);
- bool* text_start; //bool tab pointer
- bool* text_end;
- LZ77_kompresja obj1(slownik_rozmiar, text_start, text_end);
- while (obj1.completed_check() == false) {
- obj1.next_step(pos_length);
- }
- obj1.print_output_to_file(); //dodać nagłówek
- }
- //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class LZ77_dekompresja {//zaladowac plik do dwoch wektorow, wyciagnac z headera rozmiar bufora slownikowego, zrobic decode, zwrocic wektor
- private:
- vector<bool> file_header;
- vector<bool> file_pixel_info;
- int slownik_rozmiar;
- vector<bool> decoded_pixel_info;
- public:
- LZ77_dekompresja(vector<bool> file);
- void load_header();
- void load_pixel_info();
- void decode();
- };
- LZ77_dekompresja::LZ77_dekompresja(vector<bool> file) {
- }
- vector<bool> decompress() {//zaladowac plik do dwoch wektorow, wyciagnac z headera rozmiar bufora slownikowego, zrobic decode, zwrocic wektor
- fstream plik;
- vector<bool> loaded;
- plik.open("zkompresowany_obraz.bssz", ios::in | ios::binary);
- //
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement