From e69bfd0e3d325969b846d4b1c1944281ea857b6c Mon Sep 17 00:00:00 2001 From: yanczi Date: Mon, 22 Dec 2025 14:51:04 +0100 Subject: [PATCH] Wypakowywanie strumieniowe --- CreateCargo.cpp | 2 +- DataStruct.h | 6 ++--- ExtractCargo.cpp | 60 ++++++++++++++++++++++++++++++++++++++++-------- ExtractCargo.h | 4 +++- 4 files changed, 57 insertions(+), 15 deletions(-) diff --git a/CreateCargo.cpp b/CreateCargo.cpp index adbddf5..1f0d8ae 100644 --- a/CreateCargo.cpp +++ b/CreateCargo.cpp @@ -42,7 +42,7 @@ CreateCargo::~CreateCargo() { //----------------------------------------------------------------------------- bool CreateCargo::Create(const std::string& path, const uint8_t& flag) { - cargoFile = path + "." + signature; + cargoFile = path + "." + extension; catalogPath = path; methodFlags = flag; diff --git a/DataStruct.h b/DataStruct.h index af4da80..75f5a79 100644 --- a/DataStruct.h +++ b/DataStruct.h @@ -64,13 +64,13 @@ namespace fl { namespace ds { // Chunki streamowania - inline constexpr int chunk_stream = 268435456; // 256MB + inline constexpr uint32_t chunk_stream = 268435456; // 256MB // Blok chunków - inline constexpr int block_size = 131072; // 128KB + inline constexpr uint32_t block_size = 131072; // 128KB // Maksymalny rozmiar pliku do spakowania - inline constexpr int maxFileSize = 8589934592; // 8GB + inline constexpr uint64_t maxFileSize = 8589934592; // 8GB } // Flagi diff --git a/ExtractCargo.cpp b/ExtractCargo.cpp index 83f53a5..ad2e963 100644 --- a/ExtractCargo.cpp +++ b/ExtractCargo.cpp @@ -195,19 +195,59 @@ void ExtractCargo::ExtractingFilesFromCargo() std::cout << fh.size << std::endl; cargoFile.seekg(fh.offset); - std::vector buffor(fh.size); - cargoFile.read(buffor.data(), fh.size); - - std::vector rawBuffor; - computingBytes(buffor, rawBuffor, fh.flag); - - if (!HashValid(rawBuffor, fh.crc)) + // Strumień wyciągający + for (uint64_t sc = 0; sc < fh.size; sc += ds::chunk_stream) { - std::cerr << fh.nameFile << " Error: Corrupted data integration CRC" << std::endl; - } + if (fh.flag == flag::raw) + { + const uint32_t streamChunk = std::min(ds::chunk_stream, static_cast(fh.size - sc)); - file.write(reinterpret_cast(rawBuffor.data()), rawBuffor.size()); + std::vector buffer(streamChunk); + cargoFile.read(buffer.data(), streamChunk); + file.write(reinterpret_cast(buffer.data()), streamChunk); + } + else + { + uint32_t chunkLen; + uint32_t chunkBeforeSize; + uint32_t chunkLastSize; + + cargoFile.read(reinterpret_cast(&chunkLen), sizeof(chunkLen)); + cargoFile.read(reinterpret_cast(&chunkBeforeSize), sizeof(chunkBeforeSize)); + cargoFile.read(reinterpret_cast(&chunkLastSize), sizeof(chunkLastSize)); + + std::vector chunksString; + + // Dekompresja bloków + for (size_t i = 0; i < chunkLen; ++i) + { + // Pobierz rozmiar chunków przed i po skompresowaniem + uint32_t chunkSize = i < chunkLen - 1 ? chunkBeforeSize : chunkLastSize; + uint32_t chunkZipSize; + + cargoFile.read(reinterpret_cast(&chunkZipSize), sizeof(chunkZipSize)); + + // Pobierz blok chunka + std::vector buffer(chunkZipSize); + cargoFile.read(buffer.data(), chunkZipSize); + + std::vector rawBuffer(chunkSize); + if ((fh.flag & flag::zip) == flag::zip) + { + rawBuffer = (fh.flag & flag::enc) == flag::enc ? + eman.decrypt(cman.decompress(buffer, chunkSize)) : + cman.decompress(buffer, chunkSize); + } + else + { + rawBuffer = eman.decrypt(buffer); + } + + file.write(reinterpret_cast(rawBuffer.data()), chunkSize); + } + } + } file.close(); } diff --git a/ExtractCargo.h b/ExtractCargo.h index 3cab45c..3b00308 100644 --- a/ExtractCargo.h +++ b/ExtractCargo.h @@ -28,11 +28,13 @@ #include #include #include +#include #include #include "DataStruct.h" #include "ChunkManager.h" #include "EncryptionManager.h" +#include "CompressionManager.h" class ExtractCargo { public: @@ -57,7 +59,7 @@ private: std::ifstream cargoFile; EncryptionManager eman; - + CompressionManager cman; // Sprawdzenie poprawności archiwum bool CheckCargoFile();