У меня есть компрессор / декомпрессор для LZW.
Теперь я хочу использовать пользовательскую переменную (размер) чтобы сохранить размер словаря в байтах, а затем он становится достаточно большим, я возвращаю словарь в исходное состояние и начинаю заполнять его снова.
Но я не понимаю, как это реализовать. У меня было несколько попыток.
кодировщик
void lzwCodeFile(istream &in, ostream &out, uint32_t maxSize) {
unordered_map<string, uint32_t> mp;
clearAndFill(mp);
uint32_t code = 256;
uint32_t size = 256;
string w = "";
string tmp;
uint8_t c;
while (in.read((char *) &c, sizeof c)) {
tmp = w;
tmp += c;
if (mp.find(tmp) != mp.end()) {
w = tmp;
} else {
uint32_t val = mp[w];
out.write((const char *) &val, sizeof(mp[w]));
//cout << val << " ";
mp[tmp] = code++;
size += tmp.size();
w = c;
}
}
if (w.size()) {
uint32_t val = mp[w];
out.write((const char *) &val, sizeof(mp[w]));
//cout << val << " ";
}
}
дешифратор
void lzwDecodeFile(istream &in, ostream &out, uint32_t maxSize) {
unordered_map<uint32_t, string> mp;
uint32_t code = 256;
uint32_t size = 256;
clearAndFillRev(mp);
string tmp, w;
uint32_t k;
in.read((char *) &k, sizeof k);
w = "" + mp[k];
string entry;
out << w;
while (in.read((char *) &k, sizeof k)) {
// finded
if (mp.find(k) != mp.end()) {
entry = mp[k];
} else {
entry = w + w[0];
}
out << entry;
tmp = w + entry[0];
mp[code++]=tmp;
w = entry;
}
}
Задача ещё не решена.
Других решений пока нет …