2010-12-16 10 views
1

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++)

+0

Höchstwahrscheinlich bietet Stream-Adapter. Wenn nicht, dann wahrscheinlich Boost. Lesen Sie die Dokumentation. –

Antwort

2

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(); 
} 
2

Sie könnten normale istream und ostream Objekte verwenden und die pubsetbuf Methode der their streambufs 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.