2012-02-02 2 views
10

부스트 사이트에서 예제와 같이 파일의 gzip/zlib 압축 해제를 구현했습니다.부스트 gzip 압축 해제 바이트 배열

void CompressionUtils::Inflate(std::ifstream& inputFile, 
           std::ofstream& outputFile) 
{ 
    boost::iostreams::filtering_streambuf<boost::iostreams::input> in; 
    in.push(boost::iostreams::gzip_decompressor()); 
    in.push(inputFile); 
    boost::iostreams::copy(in, outputFile); 
} 

이 작동합니다. 또한 압축 된 나머지 JSON 서비스를 기반으로하는 소켓에서 데이터를 읽는 중입니다. 메모리 기반 구현을 작성하고 얼마나 어려울 수 있는지 생각했습니다. 글쎄, 나는 스트림과 스트림 버퍼를 이해하지 못한다는 것을 알아 냈다. 나는 지난 몇 년 동안 자바를 비난했다.) 그래서 나는이 길을 시작했다.

void CompressionUtils::Inflate(char* compressed, 
           int size, 
           char* decompressed) 
{ 

    boost::iostreams::stream<boost::iostreams::array_source> source(compressed,size); 
    //std::stringstream str; 

    boost::iostreams::filtering_streambuf<boost::iostreams::input> in; 
    in.push(boost::iostreams::gzip_decompressor()); 
    in.push(source); 
    //boost::iostreams::copy(in, str); 
} 

는하지만 같은 딱하다 나는 기본적으로 압축 스트림의 압축 해제 char* 표현을 얻을하는 데 사용할 수있는 스트림의 종류에. 이것은 쉽고, 아마 그렇습니다. 그러나 나는 실패한 시도로 끝나는 지난 몇 시간을 낭비하고 있습니다.

답변

6

분명히 filtering streams and stream buffers입니다. 같은 방법을 역순으로 사용하여 데이터를 문자열로 가져올 수 있습니다.

나는 편리 내 자신의 예를, 그래서 어느 정도 의사 코드가이 고려 그러나 이것은 당신이 찾고있는 무엇을해야하지 않습니다

namespace io = boost::iostreams; //<-- good practice 
typedef std::vector<char> buffer_t; 

void CompressionUtils::Inflate(const buffer_t &compressed, 
           buffer_t &decompressed) 
{ 
    io::filtering_ostream os; 

    os.push(io::gzip_decompressor()); 
    os.push(io::back_inserter(decompressed)); 

    io::write(os, &compressed[0], compressed.size()); 
} 

그래서 당신은이 제공하는 다시 삽입을 사용할 수 있습니다 후원.

기본적으로 위 코드는 사용자가 쓸 수있는 출력 스트림을 정의합니다. 이 파일은 서면으로 작성된 모든 내용이 먼저 gzip으로 압축 해제되고 back_inserter에 다음과 같이 ,이 첨부됩니다.이 파일은 back_inserters와 마찬가지로 버퍼 decompressed의 뒷면에 삽입됩니다.

또한 알 수 있듯이 버퍼는 std::vector으로 묶여 있습니다. 이게 효과가 있는지 알려주세요.

+0

답변 해 주셔서 감사합니다. 나는 그것을 시도 할 것이다. –