This is a starting point for how to compress data from a buffer using heatshrink and write the data into an output buffer:
Note that this has not been thoroughly tested, but at least it doesn’t crash 🙂
// TODO Your code goes here const size_t outbuf_size = filesize + 128; char* outbuf = new char[outbuf_size]; heatshrink_encoder* encoder = heatshrink_encoder_alloc(10, 4); size_t tosink = filesize; size_t output_size = 0; while(tosink > 0) { size_t sunk = 0; auto err = heatshrink_encoder_sink(encoder, reinterpret_cast<uint8_t*>(buf), (size_t)filesize, &sunk); if(err != HSER_SINK_OK) { std::cerr << "Error sinking data" << std::endl; break; } if(sunk == 0) { std::cerr << "No data sunk" << std::endl; break; } // Check how much has been sunk & update tosink tosink -= sunk; // Poll for output size_t polled = 0; auto err2 = heatshrink_encoder_poll(encoder, reinterpret_cast<uint8_t*>(outbuf + output_size), outbuf_size - output_size, &polled); if(err2 == HSER_POLL_ERROR_NULL || err2 == HSER_POLL_ERROR_MISUSE) { std::cerr << "Error polling data" << std::endl; break; } output_size += polled; } // Input data finished auto err3 = heatshrink_encoder_finish(encoder); // Poll for final output // Poll for output size_t polled = 0; auto err2 = heatshrink_encoder_poll(encoder, reinterpret_cast<uint8_t*>(outbuf + output_size), outbuf_size - output_size, &polled); if(err2 == HSER_POLL_ERROR_NULL || err2 == HSER_POLL_ERROR_MISUSE) { std::cerr << "Error finally polling data" << std::endl; } output_size += polled; cout << "Original size: " << filesize << ", compressed size: " << output_size << endl;