Przeniesiono kompresję do osobnej klasy i zoptymalizowano

This commit is contained in:
yanczi 2025-11-16 09:56:03 +01:00
parent fd42a5812a
commit 56ac9715fe
6 changed files with 136 additions and 90 deletions

View file

@ -35,7 +35,7 @@ std::vector<char> ChunkManager::chunked(const std::vector<char>& raw, const bool
// Skopiuj fragment danych do chunka
std::vector<char> chunk(begin, end);
std::vector<char> outChunk = encrypt ? eman.encrypt(compress_data(chunk)) : compress_data(chunk);
std::vector<char> outChunk = encrypt ? eman.encrypt(cman.compress(chunk)) : cman.compress(chunk);
uint32_t chs = chunk.size();
uint32_t zch = outChunk.size();
@ -62,56 +62,6 @@ std::vector<char> ChunkManager::chunked(const std::vector<char>& raw, const bool
return zip;
}
// Kompresja
std::vector<char> ChunkManager::compress_data(const std::vector<char>& input)
{
const int level = COMPRESSION_LEVEL;
// Obs³uga pustego chunku: zwracamy pusty wynik (0 bajtów).
if (input.empty()) return {};
ZSTD_CCtx* cctx = ZSTD_createCCtx();
if (!cctx) {
std::cerr << "ZSTD_createCCtx failed\n";
return {};
}
// Ustawienia „bez ramek”
size_t rc = 0;
rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless);
rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 0);
rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_contentSizeFlag, 0);
rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_dictIDFlag, 0);
rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, level);
if (ZSTD_isError(rc)) {
std::cerr << "ZSTD_CCtx_setParameter error\n";
ZSTD_freeCCtx(cctx);
return {};
}
const size_t srcSize = input.size();
// Szacowanie rozmiaru skompresowanego vectoru
const size_t maxDst = ZSTD_compressBound(srcSize);
std::vector<char> out(maxDst);
// Faktyczna kompresja
size_t written = ZSTD_compress2(cctx, out.data(), maxDst,
input.data(), srcSize);
ZSTD_freeCCtx(cctx);
if (ZSTD_isError(written)) {
std::cerr << "ZSTD_compress2 error: " << ZSTD_getErrorName(written) << "\n";
return {};
}
out.resize(written);
return out;
}
//////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------------
@ -142,36 +92,11 @@ std::vector<char> ChunkManager::dechunked(const std::vector<char>& zip, const bo
std::vector<char> zipChunk = encrypt ? eman.decrypt(inChunk) : std::move(inChunk);
// Zdeklarój pusty chunk
std::vector<char> chunk = decompress_data(zipChunk, chunkSize);
std::vector<char> chunk = cman.decompress(zipChunk, chunkSize);
// Scal chunki
chunksString.insert(chunksString.end(), chunk.begin(), chunk.end());
}
return chunksString;
}
// Dekompresja
std::vector<char> ChunkManager::decompress_data(const std::vector<char>& input, const size_t& expected)
{
ZSTD_DCtx* dctx = ZSTD_createDCtx();
size_t r = 0;
r |= ZSTD_DCtx_setParameter(dctx, ZSTD_d_format, ZSTD_f_zstd1_magicless);
if (ZSTD_isError(r))
{
std::cerr << "ZSTD_DCtx_setParameter error" << std::endl;
ZSTD_freeDCtx(dctx);
}
std::vector<char> output(expected);
size_t dsize = ZSTD_decompressDCtx(dctx, output.data(), expected, input.data(), input.size());
ZSTD_freeDCtx(dctx);
if (ZSTD_isError(dsize)) {
std::cerr << "ZSTD_decompressDCtx error: " << ZSTD_getErrorName(dsize) << "\n";
return {};
}
return output;
}