Seite 1 von 1

qCompress

Verfasst: 12. April 2010 15:10
von ccf_h
Hi,
ich möchte eine sqlite-Datei komprimieren. Mit qCompress geht das auch.
Das Problem ist dabei, dass diese Datei nur mit qUncompress wieder dekomprimiert werden kann. Es wäre deshalb wahrscheinlich sinnvoller das gzip-Format zu verwenden. Das unterscheidet sich aber durch einen unterschiedlichen Header, in dem Dateiname und so was gespeichert sind. Aber offenbar unterstützt zlib auch das gzip-Format, nur mit unterschiedlichen Aufrufen.
Allerdings schreckt mich die Aussicht nun die C-Bibliothek zlib direkt verwenden zu müssen (ich kann nicht so gut C). Ist es eventuell realistisch einfach die Header auszutauschen?
Falls jemand eine Idee hat, wäre ich für Tipps dankbar

Kris

Verfasst: 12. April 2010 20:01
von Christian81
Was spricht z.B. gegen quazip?

Verfasst: 14. April 2010 20:35
von ccf_h
Gegen quazip spricht nichts. Das Problem wäre ja auch über eine Einbindung von Kommandozeilenprogrammen lösbar. Aber beides ist ein bisschen zuviel, genauso wie qCompress ein bisschen zuwenig ist.
Vielen Dank trotzdem; hätte ja sein können, dass jemand eine geniale Idee parat hat; die hätte ich ungern verpassen wollen :)

Verfasst: 15. April 2010 06:31
von Christian81
quazip zu viel? Wenn eine Lib aus nichtmal 3 Sourcefiles zu viel ist - naja.

/edit:
Hier steht außerdem wie es gegenüber zlib modifiziert wurde: http://doc.trolltech.com/4.6/qbytearray ... Uncompress

Verfasst: 15. April 2010 08:59
von RHBaum
@ccf_h

Du solltest auch besser differenzieren zwischen dem Compressionsalgorythmus und einem Container.

qCompress implementiert dir den Algo, nicht den Container. Wobei der Algo auch noch paramtrisierbar iss, also wird das zielformat zumindest die parameter fuer die compression auch noch enthalten muessen ....

Ciao ....

Verfasst: 18. April 2010 18:49
von ccf_h
Vielen Dank für die Kommentare. Vielleicht habe ich mich aber auch falsch ausgedrückt: Ich kriege ein File mit untenstehenden Zeilen komprimiert (und mit entsprechend qUncompress wieder de-komprimiert. Mehr braucht es nicht; nur ist das Ergebnis nicht gzip-kompatibel (und, was ich nicht wusste, offenbar auch nicht mit zlib; vielen Dank Christian81, den Hinweis in der Doku hatte ich übersehen.) Qt verwendet aber die zlib und die zlib kann das gzip-Format lesen und schreiben. Es unterscheidet sich durch einen anderen Header. Ich glaube alles, was ich tun müsste, um mit qCompress gzip kompatibel zu sein, ist diesen Header zu schreiben.
Ich schau mirs nochmal genau an.

Code: Alles auswählen

#include <QByteArray>
#include <QFile>
#include <QApplication>

int main(int argc, char *argv[])
{
  QFile infile("nozip.dat");
  QFile outfile("zip.zip");

  infile.open(QIODevice::ReadOnly);
  outfile.open(QIODevice::WriteOnly);

  QByteArray uncompressedData = infile.readAll();
  QByteArray compressedData = qCompress(uncompressedData);

  outfile.write(compressedData);

  infile.close();
  outfile.close();
}

Verfasst: 18. April 2010 18:54
von Christian81
Nix mit Header schreiben - steht doch alles da:
Note: If you want to use this function to uncompress external data compressed using zlib, you first need to prepend four bytes to the byte array that contain the expected length (as an unsigned integer) of the uncompressed data encoded in big-endian order (most significant byte first).

Verfasst: 18. April 2010 19:14
von ccf_h
Ja schon, aber das Problem ist, wenn ich da nicht was ganz falsch verstanden habe, dass zlib nicht das gzip format schreibt und liest, wenn man nicht die entsprechenden Aufrufe benutzt, die aber in Qt so erstmal nicht integriert sind. Folgendes dazu aus der zlib faq
http://www.zlib.net/zlib_faq.html#faq18

# Why does gzip give an error on a file I make with compress/deflate?

The compress and deflate functions produce data in the zlib format, which is different and incompatible with the gzip format. The gz* functions in zlib on the other hand use the gzip format. Both the zlib and gzip formats use the same compressed data format internally, but have different headers and trailers around the compressed data.

# Ok, so why are there two different formats?

The gzip format was designed to retain the directory information about a single file, such as the name and last modification date. The zlib format on the other hand was designed for in-memory and communication channel applications, and has a much more compact header and trailer and uses a faster integrity check than gzip.