Die POCO Library erfordert einen istream für Eingabe und ostream für die Ausgabe Daten mit seinem Zlib Wrapper zu komprimieren. Ich habe Daten in einem std :: vector (unsigned char) und möchte diese Daten in einen anderen std :: vector (unsigned char) komprimieren. Gibt es einen einfachen Weg, dies zu tun?Komprimieren von Vektor mit POCO (C++)
Antwort
Ich weiß nicht, dass dies der effizienteste Weg ist, aber als Start würde ich versuchen Sie dies:
typedef unsigned char uc;
typedef vector<uc> v;
void Doit(const v& in, v& out)
{
ostringstream outStream;
DeflatingOutputStream compressor(outStream, DeflatingStreamBuf::STREAM_GZIP);
copy(in.begin(), in.end(), ostream_iterator<uc>(compressor));
compressor.close();
string outStr(outStream.str());
out.assign(outStr.begin(), outStr.end());
}
Ich vermute, dies kopiert die Daten zweimal, unnötig. Zuerst erstellt der Aufruf von ostringstream :: str() eine Kopie, und als nächstes erstellt std :: vector :: assign() eine Kopie.
@Alf P. Steinbach hatte einen ausgezeichneten Vorschlag - Boost Stream Adapter verwenden. Wenn Sie boost::iostreams::filtering_ostream
für Sie zur Verfügung haben, können Sie versuchen:
typedef unsigned char uc;
typedef vector<uc> v;
void Doit(const v& in, v& out)
{
filtering_ostream outStream(back_inserter(out));
DeflatingOutputStream compressor(outStream, DeflatingStreamBuf::STREAM_GZIP);
std::copy(in.begin(), in.end(), ostream_iterator<uc>(compressor));
compressor.close();
outStream.flush();
}
Sie könnten normale istream
und ostream
Objekte verwenden und die pubsetbuf
Methode der their streambuf
s verwenden Sie den internen Puffer des Stroms in den internen Puffer des Vektors einzustellen.
In diesem Szenario müssten Sie sicherstellen, dass der Vektor, der die Ausgabe empfängt, über genügend Speicherplatz verfügt. Da der Ostream direkt in den Puffer schreiben würde, würde keine automatische Größenänderung stattfinden.
- 1. komprimieren Vektor in (inverse von rep)
- 2. POCO: Wie Bild auf Webser mit Poco in C++
- 3. Multithread-TCP-Server mit POCO C++ - Bibliotheken
- 4. C++ Vektor von Zeigern
- 5. C/C++ Packen und Komprimieren
- 6. statische Version von Poco C++ - Bibliotheken erstellen
- 7. HTTPS-Anfrage in C++ mit Poco
- 8. C++ Vektor von Vektoren
- 9. Vektor Vektor Puffer C++
- 10. C++ Vektor mit Vererbung
- 11. C++ Vektor mit Zeiger
- 12. Komprimieren von Bildern in C# asp.net Core
- 13. Start Hintergrund Prozess mit POCO
- 14. Erklärung von POCO
- 15. Vektor von Strukturen mit Vektor der Ganzzahl
- 16. C++ Vektor von Paaren Initialisierung
- 17. C++ Problem mit Vektor push_back
- 18. Scrabble Ausgabe C++ mit Vektor
- 19. Komprimieren von LMDB-Dateien
- 20. Statisches Verknüpfen von SSL mit Poco
- 21. C# POCO T4 Vorlage, Schnittstellen generieren?
- 22. istream für die Kommandozeileneingabe für C++/Poco
- 23. Bild komprimieren mit move_uploaded_files
- 24. Erstellen von C++ - Vektor von Zeigern
- 25. Komprimieren von Zeilensätzen mit CLR und GZIP
- 26. Proxy Authentifizierung in POCO Net C++ Bibliothek
- 27. Poco C++ baut verschachtelte JSON-Objekte auf
- 28. Komprimieren Array mit pytables
- 29. Datei komprimieren mit QuaZIP
- 30. C++ Füllen Sie einen Vektor mit einem anderen Vektor
Höchstwahrscheinlich bietet Stream-Adapter. Wenn nicht, dann wahrscheinlich Boost. Lesen Sie die Dokumentation. –