2012-02-02 8 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); 
} 

इस ठीक काम करता है। मैं एक सॉकेट से भी डेटा पढ़ रहा हूं कि मुझे एक बाकी आधारित जेएसओएन सेवा से मिल रहा है जो संपीड़ित है। मैंने सोचा कि मैं एक स्मृति आधारित कार्यान्वयन लिखूंगा, यह कितना मुश्किल हो सकता है। खैर, मुझे लगा कि मुझे धाराओं और स्ट्रीम बफर को समझना नहीं है जैसा मुझे करना चाहिए। मैं जावा में पिछले कुछ वर्षों को दोषी ठहराता हूं;) .. तो मैंने इस पथ को शुरू कर दिया।

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

लेकिन मैं के रूप में एक नुकसान में हूँ धारा किस तरह मैं मूल रूप से decompressed धारा के decompressed 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()); 
} 

तो तुम वापस द्वारा प्रदान की Inserter उपयोग कर सकते हैं बढ़ावा।

असल में, उपरोक्त कोड क्या आउटपुट स्ट्रीम को परिभाषित करता है जिसे आप लिख सकते हैं। यह सेट किया गया है इतना है कि यह करने के लिए लिखा सभी सामग्री पहले gzip द्वारा decompressed किया जाएगा, और तोback_inserter जो, back_inserters करते हैं, decompressed बफर के पीछे डाल देगा के साथ जोड़ दिया।

इसके अलावा, जैसा कि आप देख सकते हैं, बफर std::vector में लिपटे हैं। अगर यह आपके काम का है, तो मुझे बताएं।

+0

आपकी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। मुझे एक कोशिश करनी ही होगी –