#include #include #include #include #include #include #include #include #include using namespace std; using namespace boost; using namespace boost::iostreams; bool compress(const std::string& source, std::string& dest, size_t destOffset) { #if !0 // this works (at least, no errors have shown so far) filtering_ostream out; out.push(zlib_compressor()); out.push(back_inserter(dest)); out << source; return true; #elif !0 // this won't work for some strings filtering_istream in; in.push(zlib_compressor()); in.push(make_iterator_range(source)); ostringstream oss; std::copy(istreambuf_iterator(in), istreambuf_iterator(), ostreambuf_iterator(oss)); dest.assign(oss.str()); return true; #else // original code by Guy (won't work for some strings) ostringstream _sink; istringstream _source(source); filtering_istreambuf in; zlib_compressor compressor; in.push(compressor); in.push(_source); copy(in, _sink); dest.insert(destOffset, _sink.str()); return compressor.unconsumed_input().empty(); #endif } bool uncompress(const string& source, string& dest, size_t destOffset) { ostringstream _sink; istringstream _source(source); filtering_istreambuf in; zlib_decompressor decompressor; in.push(decompressor); in.push(_source); copy(in, _sink); dest.insert(destOffset, _sink.str()); return decompressor.unconsumed_input().empty(); } void SimpleTestCompression(const std::string& OriginalData) { std::string CompressionDest; compress(OriginalData,CompressionDest,0); std::string DecompressionDest; uncompress(CompressionDest,DecompressionDest,0); } std::string GetBadString() { std::ifstream in("magic.bin", ios_base::binary|ios_base::in); std::string buffer; copy(in, back_inserter(buffer)); return buffer; } int main(int argc, char* argv[]) { SimpleTestCompression("Hello123"); try { SimpleTestCompression(GetBadString()); } catch (const boost::iostreams::zlib_error& e) { std::cout << "What: " << e.what() << " Error: " << e.error() << std::endl; } return 0; }