У меня есть программа на C++, которая время от времени получает буфер данных и должна добавлять ее в существующий сжатый файл.Алгоритм сжатия дефляции для огромных потоков данных
Я попытался сделать POC, прочитав 1k кусков из какого-либо файла, передав их сжатому потоку и распакуя его, когда данные закончены.
Я использую Poco :: DeflatingOutputStream для сжатия каждого фрагмента файла и Poco :: InflatingOutputStream, чтобы проверить, что после распаковки я получаю исходный файл.
Тем не менее, кажется, что после распаковки потока моих данные пошли почти идентичные исходный файл, за исключением того, что между каждыми 2 последовательными блоками данных я получаю несколько нечитаемых символы, такие как: à¿_ÿ
вот пример которая разделяется между двумя кусками. оригинальная линия выглядит следующим образом:
elevated=0 path=/System/Library/CoreServices/Dock.app/Contents/MacOS/Dock exist
в то время как декомпрессия линия:
elevated=0 path=/System/Libr à¿_ÿary/CoreServices/Dock.app/Contents/MacOS/Dock exist
19 мая 19:12:51 PANMMUZNG8WNREM ядро [0]: PID = 904 UID = 1873876126 SBIT = 0
любая идея, что я делаю неправильно. Вот мой POC код:
int zip_unzip() {
std::ostringstream stream1;
Poco::DeflatingOutputStream gzipper(stream1, Poco::DeflatingStreamBuf::STREAM_ZLIB);
std::ifstream bigFile("/tmp/in.log");
constexpr size_t bufferSize = 1024;
char buffer[bufferSize];
while (bigFile) {
bigFile.read(buffer, bufferSize);
gzipper << buffer;
}
gzipper.close();
std::string zipped_string = stream1.str();
//////////////////
std::ofstream stream2("/tmp/out.log", std::ios::binary);
Poco::InflatingOutputStream gunzipper(stream2, InflatingStreamBuf::STREAM_ZLIB);
gunzipper << zipped_string;
gunzipper.close();
return 0;
}