2010-03-18 7 views
3

Есть ли какая-то магия, необходимая для получения "zlib sync flush" при использовании boost::iostreams::zlib_compressor? Просто нажимая flush на фильтр, или strict_sync на filtering_ostream, содержащий его, не видит, чтобы выполнить задание (т. Е. Я хочу, чтобы компрессор был достаточно ровным, чтобы декомпрессор мог восстановить все байты, потребляемые компрессором до сих пор, не закрывая поток).Сброс boost :: iostreams :: zlib_compressor. Как получить «синхронизацию»?

Глядя на header, кажется, есть некоторые «флеш коды», определенные (знатно sync_flush), но это не ясно мне, как они должны быть использованы (имея в виду мой компрессор просто добавил в filtering_ostream).

ответ

1

Оказывается, существует фундаментальная проблема, что symmetric_filter что zlib_compressor наследует от не самого Смываемого (который кажется довольно упущение).

Возможно, такая поддержка для symmetric_filter будет такой же простой, как добавление flushable_tag и ознакомление с существующими частными методами очистки, но пока я могу жить с ним.

0

Это C++ библиотека Zlib обертка, из которой я автор, поддерживает флеш-функциональность и, возможно, проще в использовании:

https://github.com/rudi-cilibrasi/zlibcomplete

Это так же просто, как это:

#include <iostream> 
#include <zlc/zlibcomplete.hpp> 

using namespace zlibcomplete; 
using namespace std; 

int main(int argc, char **argv) 
{ 
    const int CHUNK = 16384; 
    char inbuf[CHUNK]; 
    int readBytes; 
    ZLibCompressor compressor(9, auto_flush); 
    for (;;) { 
    cin.read(inbuf, CHUNK); 
    readBytes = cin.gcount(); 
    if (readBytes == 0) { 
     break; 
    } 
    string input(inbuf, readBytes); 
    cout << compressor.compress(input); 
    } 
    cout << compressor.finish(); 
    return 0; 
} 

Основное отличие от boost заключается в том, что вместо использования фильтра класса шаблона вы просто передаете строку и выписываете сжатую строку, которая выводится столько раз, сколько вы хотите. Каждая строка будет очищена (в режиме auto_flush), поэтому ее можно использовать в интерактивных сетевых протоколах. В конце концов просто завершите вызов, чтобы получить последний бит сжатых данных и блок завершения. Хотя пример форсирования короче, для этого требуется использование двух других классов шаблонов, которые не так широко известны как std :: string, а именно filtering_streambuf и менее стандартного boost :: iostreams: copy. Интерфейс boost для zlib является неполным, поскольку он не поддерживает Z_SYNC_FLUSH. Это означает, что он не подходит для онлайновых потоковых приложений, таких как интерактивные протоколы TCP. Мне нравится форсировать и использовать его в качестве моей основной библиотеки поддержки C++ во всех моих проектах на C++, но в этом конкретном случае она не использовалась в моем приложении из-за отсутствия функций флеша.

+0

Возможно, вы можете продемонстрировать конкретный образец здесь, на StackOverflow, на _how_, это, на ваш взгляд, как автор библиотеки, является simpeler для использования? –

+0

Спасибо, я сделал это, оцените отзывы. –