This repository was archived by the owner on Feb 2, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBitBufferForCompress.h
More file actions
93 lines (87 loc) · 2.24 KB
/
BitBufferForCompress.h
File metadata and controls
93 lines (87 loc) · 2.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#pragma once
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
#define BUFBAYT 512
#define BAYT 8
/// Класс, который записывает в файл символы
/**
* Принимает двоичные эквиваленты символов которые нужно
* записать в файл. Накапливает их и когда буффер заполняется
* записывает в файл, преобразовав первые 8 intов из буффера
* в один символ.
*/
class Buffer_comp {
private:
vector<int>* buf;
int kod_numb = 0;
public:
/// Конструктор
Buffer_comp() {
buf = new vector<int>;
}
/// Функция для добавления нового символа в буффер
/**
* Добавляет новый символ (последовательность нулей и единиц) в буффер.
* Если размер буффера станет больше чем константа BUFBAYT, то
* вызывается функция записи в файл recording
@param outf Файл для записи
@param vec Код символа, которого нужно добавить в буффер
*/
void push_for_compress(ofstream& outf, vector<int>& vec) {
for (int i = 0; i < vec.size(); i++) {
if (buf->size() > BUFBAYT) {
recording(outf);
}
buf->push_back(vec[i]);
}
}
/// Функция очищения буффера
/**
*Очищает буффер. Добавляет нули на недостающие до
* кратного 8 размеру буффера и записывает все символы в файл
@outf Выходной файл
*/
void clean(ofstream& outf) {
int finish = BAYT - (buf->size() % BAYT);
for (int i = 0; i < finish; i++) {
buf->push_back(0);
}
while (buf->size() != 0) {
unsigned char simv = 0;
for (int i = 0; i < BAYT; i++) {
int tmp = (*buf)[0];
tmp = tmp << (BAYT - i - 1);
simv = (unsigned char)tmp | simv;
buf->erase(buf->begin());
}
outf << simv;
kod_numb++;
}
}
/// Функция записи в файл
/**
* Записывает в файл символы, предварительно сформировав их из
* превых 8 intов буффера. Формирует их благодаря сдвигу и маске.
@param outf Выходной файл
*/
void recording(ofstream& outf) {
int a;
while ((a = (buf->size() - BUFBAYT)) > 0) {
unsigned char simv = 0;
for (int i = 0; i < BAYT; i++) {
int tmp = (*buf)[0];
tmp = tmp << (BAYT - i - 1);
simv = (unsigned char)tmp | simv;
buf->erase(buf->begin());
}
outf << simv;
kod_numb++;
}
}
/// Функция которая возващает kod_numb
int getNumb() {
return kod_numb;
}
};