我正在使用boost iostreams(1.64.0)來解壓縮zlib數據。 我想做流式解壓。這意味着壓縮數據的大小是不可預測的。 我寫了下面的代碼示例。如何使用boost iostreams流式解壓縮
#include <sstream>
#include <string>
#include <iostream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/zlib.hpp>
int main() {
// Compress
std::stringstream sender;
boost::iostreams::filtering_streambuf<boost::iostreams::input> out;
out.push(boost::iostreams::zlib_compressor());
out.push(sender);
sender << "Hello World";
std::stringstream compressed;
boost::iostreams::copy(out, compressed);
// Decompress
boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
in.push(boost::iostreams::zlib_decompressor());
in.push(compressed);
std::istream is(&in);
std::size_t const buf_size = 256;
char buf[buf_size] = { '\0' };
#if 0
is.getline(buf, buf_size); // works fine
#else
std::size_t read_size = is.readsome(buf, buf_size);
std::cout << "read_size:" << read_size << std::endl;
#endif
// http://www.cplusplus.com/reference/ios/ios/rdstate/
std::cout << "rdstate:" << is.rdstate() << std::endl;
std::cout << buf << std::endl;
}
我用readsome()
因爲數據的大小是不可預知的。 我得到了以下的輸出:
read_size:0
rdstate:0
這是意外的我。
如果我使用getline()
代替readsome()
,我得到了以下的輸出:
rdstate:2
Hello World
據預計輸出。
我認爲當我使用readsome()
時,輸出應該是相同的。 我不能在實際的代碼中使用getline()
,因爲原始數據是二進制格式。
有沒有什麼辦法可以使用readsome()
與filtering_streambuf
或任何好的方法來解壓縮不可預知的長度的二進制數據?
爲什麼不使用'閱讀()'代替 – sehe
謝謝你的評論。我意識到我誤解了'istream :: read()'和'istream :: readsome()'就像'boost asio'的'read()'和'socket :: read_some()'一樣。 我取代 '的std ::爲size_t read_size = is.readsome(BUF,buf_size);'' 的std :: COUT << 「read_size:」 << read_size <<的std :: ENDL;' 與 '是。read(buf,buf_size);' 'std :: size_t read_size = is.gcount();' 'std :: cout <<「read_size:」<< read_size << std :: endl;' then my代碼工作正如我所料。 –