zlib verwenden, aber wie?

Alles rund um die Programmierung mit Qt
Antworten
Marc Schubert
Beiträge: 30
Registriert: 18. Mai 2005 10:00
Wohnort: Hannover

zlib verwenden, aber wie?

Beitrag von Marc Schubert »

Hallo,

ich möchte mittels zlib ein QBytearray komprimieren, leider komme ich mit der zlib Dokumentation nicht klar. Das Beispiel hat mir leider auch nicht wirklich weitergeholfen.

Hat jemand ein Codebeispiel für mich, wie ich ein QBytearray de-/komprimieren kann?

Mit freundlichen Grüßen

Marc Schubert
stippy
Beiträge: 80
Registriert: 29. Juli 2005 09:38
Wohnort: Mönchengladbach

Beitrag von stippy »

Hallo Marc!

Ich habe mal mit Qt und der zlib was komprimiert! Kann jetzt aber nicht sagen, dass das so arg schwer war! Die vorhandenen Beispiele haben mir sehr gut geholfen.
Wo genau ist denn Dein (Verständnis-) Problem?

Gruss, Dirk
dani
Beiträge: 28
Registriert: 11. August 2005 22:22

Beitrag von dani »

Ich hab mir mal die Dokumentation angeschaut. So wie ich das sehe, müsste Folgendes gehen (nicht getestet):

Code: Alles auswählen

QByteArray data("Das ist ein Test");
QByteArray compressed_data = qCompress(data);
Du kannst qCompress dann noch einen zweiten Parameter, int compressionLevel, übergeben.
Marc Schubert
Beiträge: 30
Registriert: 18. Mai 2005 10:00
Wohnort: Hannover

Beitrag von Marc Schubert »

Hallo,

ersteinmal danke für die antworten.

@Dani

qCompress war mein erster weg. Es scheint auch wie von dir angegebn zu funktionieren, leider ist die Compression sehr gering, auch auf dem höchsten level. Das war auch der Grund warum ich nach einer zlib lösung suche.

@ Stippi

der grad der schwierigkeit hängt stark vom betrachtungswinkel ab. ich mache das nur als hobby und bin nicht zu 100% in der materie drin. darum suche ich mir immer ein paar source fetzen mit den ich üben/spielen kann.

zum beispiel

Code: Alles auswählen

void test_compress      OF((Byte *compr, uLong comprLen,
                            Byte *uncompr, uLong uncomprLen));
oder

Code: Alles auswählen

void test_compress(compr, comprLen, uncompr, uncomprLen)
    Byte *compr, *uncompr;
    uLong comprLen, uncomprLen;
diese art der deklaration ist mir nicht geläufig und stellt mich schon vor das erste problem. das zweite wäre dann die verwendeten datentypen. ich möchte ja ein qbytearray verweden. wie würde ich das anstellen.

wenn du da einen alten codefetzen hättest den ich mir mal anschauen dürfte, wäre mir schon viel geholfen.

Vielen Dank für eure Hilfe

Marc Schubert
dani
Beiträge: 28
Registriert: 11. August 2005 22:22

Beitrag von dani »

Marc Schubert hat geschrieben: @Dani

qCompress war mein erster weg. Es scheint auch wie von dir angegebn zu funktionieren, leider ist die Compression sehr gering, auch auf dem höchsten level. Das war auch der Grund warum ich nach einer zlib lösung suche.
Ich will ja nichts sagen, allerdings findet sich in der Dokumentation folgender Hinweis:

"The default value is -1, which specifies zlib's default compression."

Also wird da auch zlib verwendet und sollte das gleiche Ergebnis bringen. ;)
stippy
Beiträge: 80
Registriert: 29. Juli 2005 09:38
Wohnort: Mönchengladbach

Beitrag von stippy »

Sodele, ich hab mal meinen alten Code rausgekramt!

Code: Alles auswählen

   const int BUFFER_SIZE = 1024;
   Q_INT8 buffer[BUFFER_SIZE];
   gzFile gzfile;
   QFile sourcefile( sourcefile_abs_path );
   QDataStream sourcestream( &sourcefile );
   
   if( ( gzfile = gzopen( ( char * ) targetfile_abs_path.latin1(), "wb" ) ) == 0 )
     
   if( !sourcefile.open( IO_ReadOnly ) )
     
   while( !sourcestream.atEnd() )
   {
      int i = 0;
      while( !sourcestream.atEnd() && i < BUFFER_SIZE )
      {
         sourcestream >> buffer[i];
         i++;
      }
      for( int k = 0; k < i; k++ )
      {
         gzputc( gzfile, ( char ) buffer[k] );
      }
   }
   
   sourcefile.close();
   gzclose( gzfile );

 }
Hab Ausgaben und Fehlermeldungen rausgekürtzt. Ich hoffe Du kannst was damit anfangen.
Das hat so auf jeden Fall funktioniert und lehnt sich glaube ich an das Beispiel der zlib an.

Gruss, Dirk
stippy
Beiträge: 80
Registriert: 29. Juli 2005 09:38
Wohnort: Mönchengladbach

Beitrag von stippy »

Hallo nochmal,

so wies aussieht gibt es das ganze in Qt schon! Mir ist auch schon aufgefallen, das man beim configure ne zlib angeben kann.
QByteArray qCompress ( const QByteArray & data )
Compresses the array data and returns the compressed byte array using zlib.
See also qUncompress().
Da gibt es doch die Möglichkeit ne qt zlib oder ne system zlib zu verwenden (oder täusche ich mich). Evtl erklärt das unterschiedliche Komprimierungsgrade.
Zu beachten ist natürlich auch was komprimiert werden soll....

Gruss, Dirk
Antworten