heatshrink-Komprimierungsbibliothek: Wie man Daten aus einem Puffer komprimiert

Dies ist ein Ausgangspunkt dafür, wie man Daten aus einem Puffer mit heatshrink komprimiert und die Daten in einen Ausgabepuffer schreibt:

Beachte, dass dies nicht gründlich getestet wurde, aber zumindest stürzt es nicht ab :-)

heatshrink_example.cpp
// TODO Dein Code kommt hier hin
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;
    }
    // Prüfen, wie viel gesendet wurde // Check how much has been sunk & update tosink tosink aktualisieren
    tosink -= sunk;
    // Nach Ausgabe pollen
    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;
}
// Eingabedaten fertig
auto err3 = heatshrink_encoder_finish(encoder);
// Nach finaler Ausgabe pollen
// Nach Ausgabe pollen
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;

Ähnliche Beiträge nach Kategorie: C/C++ Embedded