Я создаю приложение, в котором мне нужно хранить много строковых данных — полученных кусками.
Я пытаюсь сохранить его в сжатом формате. однако, если я использую zlib для сжатия строк и аналогичным образом добавляю к нему более сжатые фрагменты, распаковка завершается неудачно.
std::string allinput = "AAAA";
std::string cstr1 = compress_string( allinput );
std::string allinput2 = "BBBB";
std::string cstr2 = compress_string( allinput2 );
std::string cstr = cstr1 + cstr2;
std::string out = decompress_string( cstr );
std::cout << "DECOMP:" << out << "\n" ;
С помощью приведенного выше кода я получаю следующий вывод:
AAAA
Есть ли способ распаковать добавленные куски сжатых строк
PS: реализация compress_string
а также decompress_string
можно найти из Фрагмент кода C ++ — сжатие строк STL с помощью zlib
Ваша идея добавления сжатых блоков не будет работать хорошо, и вы должны заменить этот интерфейс, https://panthema.net/2007/0328-ZLibString.html Злибу.
Если вы загляните внутрь zlib, вы увидите, что процедура сжатия deflate
остановится, когда закончится сжатие данных на основе avail_in
,
Установите это количество данных, которое у вас есть, и увеличьте, когда вы получите новую строку.
(Если вы хотите получать полезные результаты на каждом этапе, это становится более сложным.)
Сжать несколько строк по отдельности и сложить их вместе было бы возможно, но это плохая идея. Это увеличит накладные расходы и даст худший результат, поскольку сжатие основано на шаблонах во входных данных, и многократное сжатие требует повторного обнаружения шаблонов в каждом входе.
Других решений пока нет …