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
qCompress
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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
Vielen Dank trotzdem; hätte ja sein können, dass jemand eine geniale Idee parat hat; die hätte ich ungern verpassen wollen
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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
/edit:
Hier steht außerdem wie es gegenüber zlib modifiziert wurde: http://doc.trolltech.com/4.6/qbytearray ... Uncompress
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
@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 ....
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 ....
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.
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();
}
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
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).
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
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.
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.