2016-05-19 4 views
0

У меня есть программа на 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; 
} 

ответ

0

Хорошо, я просто понял, я использовал «< <» оператора на каждой операции чтения из HugeFile (оригинал распакованного файла) без помощи, так как не было пустой символ завершения «/ 0 'в конце каждого окна, которое я прочитал из файла.

Это исправленная версия:

#include <stdio.h> 
#include <fstream> 
#include <Poco/DeflatingStream.h> 
#include <Poco/Exception.h> 
#include <iostream> 


int BetterZip() 
{ 
    try { 
    // Create gzip file. 
    std::ofstream output_file("/tmp/out.gz", std::ios::binary); 
    Poco::DeflatingOutputStream output_stream(output_file, Poco::DeflatingStreamBuf::STREAM_GZIP); 

    // INPUT 
    std::ifstream big_file("/tmp/hugeFile"); 
    constexpr size_t ReadBufferSize = 1024; 
    char buffer[ReadBufferSize]; 
    while (big_file) { 
     big_file.read(buffer, ReadBufferSize); 
     output_stream.write(buffer, big_file.gcount()); 
    } 

    output_stream.close(); 
    } catch (const Poco::Exception& ex) { 
     std::cout << "Error : (error code " << ex.code() << " (" << ex.displayText() << ")"; 
     return EINVAL; 
    } 

    return 0; 
} 
Смежные вопросы