diff --git a/ChunkManager.cpp b/ChunkManager.cpp index 58529ed..980d5ac 100644 --- a/ChunkManager.cpp +++ b/ChunkManager.cpp @@ -35,7 +35,7 @@ std::vector ChunkManager::chunked(const std::vector& raw, const bool // Skopiuj fragment danych do chunka std::vector chunk(begin, end); - std::vector outChunk = encrypt ? eman.encrypt(compress_data(chunk)) : compress_data(chunk); + std::vector 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 ChunkManager::chunked(const std::vector& raw, const bool return zip; } -// Kompresja -std::vector ChunkManager::compress_data(const std::vector& 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 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 ChunkManager::dechunked(const std::vector& zip, const bo std::vector zipChunk = encrypt ? eman.decrypt(inChunk) : std::move(inChunk); // Zdeklarój pusty chunk - std::vector chunk = decompress_data(zipChunk, chunkSize); + std::vector chunk = cman.decompress(zipChunk, chunkSize); // Scal chunki chunksString.insert(chunksString.end(), chunk.begin(), chunk.end()); } return chunksString; -} - -// Dekompresja -std::vector ChunkManager::decompress_data(const std::vector& 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 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; } \ No newline at end of file diff --git a/ChunkManager.h b/ChunkManager.h index a98de14..55c32db 100644 --- a/ChunkManager.h +++ b/ChunkManager.h @@ -6,17 +6,11 @@ #include #include #include -#define ZSTD_STATIC_LINKING_ONLY -#include - -#if ZSTD_VERSION_NUMBER < 10400 -#error "Wymagane zstd >= 1.4.0 dla ZSTD_c_format / ZSTD_f_zstd1_magicless" -#endif #include "EncryptionManager.h" +#include "CompressionManager.h" #define BLOCK_SIZE 131072 // 128KB -#define COMPRESSION_LEVEL 3 struct BlockSize { @@ -38,6 +32,7 @@ public: private: EncryptionManager eman; + CompressionManager cman; std::vector blockSizes; // Przekonwertuj zmienną na ciąg na vector @@ -59,11 +54,5 @@ private: return tmp; } - - // Kompresja - std::vector compress_data(const std::vector&); - - // Dekompresja - std::vector decompress_data(const std::vector&, const size_t&); }; diff --git a/CompressionManager.cpp b/CompressionManager.cpp new file mode 100644 index 0000000..56825a4 --- /dev/null +++ b/CompressionManager.cpp @@ -0,0 +1,95 @@ +#include "CompressionManager.h" + +CompressionManager::CompressionManager() + :cctx(ZSTD_createCCtx()) + ,dctx(ZSTD_createDCtx()) +{ + // Tu ustawienia pod kompresję + const int level = COMPRESSION_LEVEL; + + // Ustawienia frameless + size_t rc = 0; + + // Wyłącza ramkę i przestawia strumień na czyste bloki + rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_format, ZSTD_f_zstd1_magicless); + + // Wyłącza sumę kontrolną na poziomie ramki + rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_checksumFlag, 0); + + // Wyłącza zapisywanie „content size” w nagłówku ramki + rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_contentSizeFlag, 0); + + // Wyłącza zapisywanie identyfikatora słownika + rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_dictIDFlag, 0); + + // Ustawia poziom kompresji + rc |= ZSTD_CCtx_setParameter(cctx, ZSTD_c_compressionLevel, level); + + if (ZSTD_isError(rc)) { + std::cerr << "ZSTD_CCtx_setParameter error" << std::endl; + ZSTD_freeCCtx(cctx); + } + + /*====Tutaj Dekompresja=============================================================*/ + + size_t r = 0; + + // Przestawia dekompresję na czyste bloki bez nagłówka + 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); + } +} + +CompressionManager::~CompressionManager() +{ + ZSTD_freeCCtx(cctx); + ZSTD_freeDCtx(dctx); +} + +//----------------------------------------------------------------------------- +// Kompresja ZSTD frameless +//----------------------------------------------------------------------------- +std::vector CompressionManager::compress(const std::vector& input) +{ + // Obsługa pustego chunku: zwracamy pusty wynik (0 bajtów). + if (input.empty()) return {}; + + const size_t srcSize = input.size(); + + // Szacowanie rozmiaru skompresowanego vectoru + const size_t maxDst = ZSTD_compressBound(srcSize); + + std::vector out(maxDst); + + // Faktyczna kompresja + size_t written = ZSTD_compress2(cctx, out.data(), maxDst, + input.data(), srcSize); + + if (ZSTD_isError(written)) { + std::cerr << "ZSTD_compress error: " << ZSTD_getErrorName(written) << std::endl; + return {}; + } + + out.resize(written); + return out; +} + +//----------------------------------------------------------------------------- +// Dekompresja ZSTD +//----------------------------------------------------------------------------- +std::vector CompressionManager::decompress(const std::vector& input, const size_t& expected) +{ + std::vector output(expected); + + size_t dsize = ZSTD_decompressDCtx(dctx, output.data(), expected, input.data(), input.size()); + + if (ZSTD_isError(dsize)) { + std::cerr << "ZSTD_decompressDCtx error: " << ZSTD_getErrorName(dsize) << "\n"; + return {}; + } + + return output; +} \ No newline at end of file diff --git a/CompressionManager.h b/CompressionManager.h new file mode 100644 index 0000000..e49956a --- /dev/null +++ b/CompressionManager.h @@ -0,0 +1,29 @@ +#pragma once + +#include +#include +#include +#include +#define ZSTD_STATIC_LINKING_ONLY +#include + +#if ZSTD_VERSION_NUMBER < 10400 +#error "Wymagane zstd >= 1.4.0 dla ZSTD_c_format / ZSTD_f_zstd1_magicless" +#endif + +#define COMPRESSION_LEVEL 3 + +class CompressionManager +{ +public: + CompressionManager(); + ~CompressionManager(); + + std::vector compress(const std::vector&); + std::vector decompress(const std::vector&, const size_t&); + +private: + ZSTD_CCtx* cctx; + ZSTD_DCtx* dctx; +}; + diff --git a/voidcmd.vcxproj b/voidcmd.vcxproj index cfb9278..cd5c1f3 100644 --- a/voidcmd.vcxproj +++ b/voidcmd.vcxproj @@ -133,6 +133,7 @@ + @@ -142,6 +143,7 @@ + diff --git a/voidcmd.vcxproj.filters b/voidcmd.vcxproj.filters index e26190f..d4a64b3 100644 --- a/voidcmd.vcxproj.filters +++ b/voidcmd.vcxproj.filters @@ -36,6 +36,9 @@ Pliki ĹşrĂłdĹ‚owe + + Pliki ĹşrĂłdĹ‚owe + @@ -59,6 +62,9 @@ Pliki nagłówkowe + + Pliki nagłówkowe +