2010-03-18 3 views
3

boost::iostreams::zlib_compressor을 사용할 때 "zlib sync flush"을 얻는 데 필요한 마술이 있습니까? 필터에 flush을 호출하거나 strict_syncfiltering_ostream이 포함되어 있으면 해당 작업을 수행 할 수 없습니다 (즉, 압축기가 스트림을 닫지 않고 지금까지 압축기에서 소비 한 모든 바이트를 복구 할 수 있도록 플러시해야합니다.). header 보면플러시 boost :: iostreams :: zlib_compressor. "동기화 플러시"를 얻는 방법?

, 정의 일부 "플러시 코드"(주목할 만하게 sync_flush을) 것 같다하지만 그들이 (베어링 염두에 내 압축기 그냥 filtering_ostream에 추가됩니다) 사용하는 방법을 나에게 불분명하다.

답변

1

이 (오히려 간과 보인다)에서 symmetric_filterzlib_compressor 그 상속이 풀림 성 그 자체입니다 근본적인 문제가 밝혀졌습니다.

아마도 symmetric_filter에 이러한 지원을 추가하는 것은 을 추가하고 기존 개인 플러시 방법을 노출하는 것처럼 간단 할 수 있지만 현재는 함께 살 수 있습니다.

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; 
} 

부스트와의 주요 차이점은 템플릿 클래스 필터를 사용하는 대신 단순히 문자열을 전달하고 원하는만큼 여러 번 압축 된 문자열을 작성한다는 것입니다. 각 문자열은 자동 플러시 모드에서 플러시되어 대화식 네트워크 프로토콜에서 사용할 수 있습니다. 마지막에는 압축 데이터와 종료 블록의 마지막 비트를 얻기 위해 finish를 호출하십시오. boost 예제가 더 짧지 만 std :: string으로 잘 알려지지 않은 두 개의 다른 템플릿 클래스, 즉 filtering_streambuf와 표준이 아닌 boost :: iostreams : copy를 사용해야합니다. zlib에 대한 부스트 인터페이스는 Z_SYNC_FLUSH를 지원하지 않으므로 불완전합니다. 즉, TCP 대화 형 프로토콜과 같은 온라인 스트리밍 응용 프로그램에는 적합하지 않습니다. 부스트를 좋아하고 내 C++ 프로젝트의 모든 주요 C++ 지원 라이브러리로 사용하지만이 특별한 경우에는 누락 된 플러시 기능으로 인해 내 응용 프로그램에서 사용할 수 없습니다.

+0

아마도 여기에 StackOverflow에 구체적인 샘플을 보여줄 수 있습니다 _how_ 이것에 대한 의견으로는 라이브러리 작성자가 사용하는 simpeler입니까? –

+0

감사합니다. 의견을 보내 주시면 감사하겠습니다. –

관련 문제