zlib



  • Hi,
    und frohe Weihnachten :xmas1:

    Ich verwende die zlib + minizip um mit C++ zip Dateien zu verwalten.

    Könnte man diese libs vielleicht um den den Modus LZMA "erweitern" ? Für den LZMA SDK finde ich nämlich keine (einfachen) Samples.



  • DarkShadow44 schrieb:

    Hi,
    und frohe Weihnachten :xmas1:

    Ich verwende die zlib + minizip um mit C++ zip Dateien zu verwalten.

    Könnte man diese libs vielleicht um den den Modus LZMA "erweitern" ? Für den LZMA SDK finde ich nämlich keine (einfachen) Samples.

    "Man" könnte. Wenn sich doch nur ein "Man" fände.

    Es gibt die xz-utils für die lzma Komprimierung. Einfache Beispiele wirst Du aber momentan wahrscheinlich nicht finden.

    Zufälligerweise arbeite ich gerade den xz-utils. Und zwar mit der stream-API. Ich habe mir einen std::iostream drum gebastelt, der einfach zu verwenden ist.



  • Das LZMA SDK verwendest du z.B. einfach so:

    lzma_decompress(sourceBuf,destBuf,sourceBufSize,destBufSize);
    


  • Aber wie kann ich Dateien nur auslesen, d.h ohne sie auf die Festplatte zu entpacken ?
    Und bei dem LZMA SDK, welche Source/Header-Dateien brauche ich alle ?



  • DarkShadow44 schrieb:

    Aber wie kann ich Dateien nur auslesen, d.h ohne sie auf die Festplatte zu entpacken ?
    Und bei dem LZMA SDK, welche Source/Header-Dateien brauche ich alle ?

    Die LZMA-API ist momentan noch sehr spärlich dokumentiert. Die API ist aber der zlib-API sehr ähnlich. Ich habe einfach meine std::iostreams für zlib genommen und die Aufrufe durch die entsprechenden aus der LZMA-API ersetzt.

    Die xz-utils sind die Nachfolger von LZMA SDK. Daher empfehle ich eher die xz-utils. Den Link habe ich bereits geschickt. Nimm einfach die momentan neueste Version (xz-4.999.9beta.tar.gz).

    Bei den meisten modernen Systemen kannst Du die benötigten Bibliotheken und Header aber auch mit apt-get install liblzma-dev oder so ähnlich installieren. Bei Ubuntu geht das allerdings erst seit 9.10. Bei 9.04 war das noch nicht drin.

    Wenn Du die Daten auf die Festplatte entpacken willst, dann musst Du die Daten entpacken und dann auf die Festplatte schreiben. Wenn Du die Daten nicht auf die Festplatte entpacken willst, dann lass das schreiben auf die Festplatte einfach weg. Klar?



  • Jetzt habe ich eine "liblzma.a"
    Wie mache ich daraus eine lib ?

    Tutorial zu den Funktionen habe ich auch nicht gefunden, aber ich brauche erstmal die LIB.

    EDIT: Ich hab's jetzt mit der "cyglzma-1.dll" zum Laufen gebracht, aber immer noch keinen Plan, wie man einelne Dateien in ein Buffer entpackt. Könntet ihr mir ein Tutorial/Beispiel für die Verwendung dieser Api geben ? 🙂



  • Also die liblzma.a ist die lib.

    Ich möchte Dich nicht unbedingt entmutigen, wenn es nicht nötig wäre, aber ich fürchte es ist.

    Du hast von dem Weg zu Deinem Ziel bisher schätzungsweise 2% geschafft. Es gibt keine Tutorials oder einfache Beispiele zu xz. Du musst Dich durch die Header quälen. Kenntnis der stream-API von zlib oder bzlib sind sehr hilfreich, da die stream-API von xz genauso funktioniert.



  • Also die liblzma.a ist die lib.

    Die hab ich umbenannt (in .lib) und mitgelinkt, aber Visual C++ erkennt sie trotzdem nicht an (unaufgelöste Verweise). 😞

    Weil das mit der Cygwin-Dll ist keine entgültige Lösung.

    Es gibt keine Tutorials oder einfache Beispiele zu xz

    Könntest du mir nicht deinen Code zeigen ? 🙂

    Ansonsten werde ich mir die Header noch mal durchschauen ^^



  • DarkShadow44 schrieb:

    Also die liblzma.a ist die lib.

    Die hab ich umbenannt (in .lib) und mitgelinkt, aber Visual C++ erkennt sie trotzdem nicht an (unaufgelöste Verweise). 😞

    Weil das mit der Cygwin-Dll ist keine entgültige Lösung.

    Es gibt keine Tutorials oder einfache Beispiele zu xz

    Könntest du mir nicht deinen Code zeigen ? 🙂

    Ansonsten werde ich mir die Header noch mal durchschauen ^^

    Mein Code ist unter http://svn.openzim.org/viewvc.cgi/branches/zim2/zimlib/ zu finden. Da speziell die Dateien include/zim/lzmastream.h, include/zim/unlzmastream.h, src/lzmastream.cpp und src/unlzmastream.cpp. Das sind Klassen, die die xz-Bibliothek in einfacher zu verwendende std::iostream-abgeleitete Klassen packen.



  • Aber da steht auch nichts von open/unpack/... 😞

    Wie soll ich damit Dateien entpacken, die z.B. in "c:\temp\test.zip" liegen ??

    Außerdem, welchen Wert soll ich "LZMA_MEMORY_SIZE" geben ? Das ist nicht definiert...

    Ansonsten kompiliert er aber alles.

    Kannst du mir vielleicht ein paar Tipps zu den Klassen geben ? 🙂

    EDIT:
    Was ist eigentlich der Unterschied zwischen den xz-Utils und dem LZMA SDK ?
    Der verwendet doch auch Streams...

    EDIT2:
    Kann man eigentlich mit XZ-Utils / LZMA-SDK auch mehrere Dateien in EIN Archiv packen ?



  • Die Klassen sind reine Filter. Die lesen oder schreiben keine Dateien. zim::LzmaStream schreibt Komprimierte Daten in einen std::ostream und zim::UnlzmaStream liest von einem std::istream und liefert die dekomprimierten Daten.

    Willst Du Dateien behandeln, verwendest Du std::ifstream und std::ofstream. Willst Du im Speicher komprimieren oder dekomprimieren, kannst Du std::[io]stringstream verwenden. Willst Du Daten komprimiert über ein Netzwerk schicken, verwendest Du halt einen iostream, welcher Netzwerkkommunikation macht (wie z. B. mein cxxtools::net::TcpStream).

    Also hier ein Programm, welches eine oder mehrere Dateien mit lzma komprimiert:

    #include <iostream>
    #include <fstream>
    #include <zim/lzmastream.h>
    
    int main(int argc, char* argv[])
    {
      try
      {
        for (int a = 1; a < argc; ++a)
        {
          std::ifstream in(argv[a]);
          std::string ofilename = argv[a];
          ofilename += ".xz";
          std::ofstream out(ofilename.c_str());
    
          zim::LzmaStream s(out);
    
          char ch;
          while (in.get(ch))
            s << ch;
          // oder kürzer:
          //   s << in.rdbuf();
    
          s.end();
        }
      }
      catch (const std::exception& e)
      {
        std::cerr << e.what() << std::endl;
      }
    }
    

    Und hier ein Programm, welches lzma-komprimierte Dateien auspackt und auf der Standardausgabe ausgibt:

    #include <iostream>
    #include <fstream>
    #include <zim/unlzmastream.h>
    
    int main(int argc, char* argv[])
    {
      try
      {
        for (int a = 1; a < argc; ++a)
        {
          std::ifstream in(argv[a]);
          zim::UnlzmaStream s(in);
    
          char ch;
          while (s.get(ch))
            std::cout << ch;
          // oder kürzer:
          //   std::cout << s.rdbuf();
        }
      }
      catch (const std::exception& e)
      {
        std::cerr << e.what() << std::endl;
      }
    }
    

    Entsprechende Klassen habe ich auch für zlib und bzip2.

    LZMA_MEMORY_SIZE ist bei mir standardmässing 128 (also 128MB Speicher).

    Und xz-utils ist der Nachfolger von lzma-utils.

    Lzma ist ein reiner Komprimieralgorithmus. Wenn Du mehrere Dateien in ein Archiv packen willst, brauchst Du noch einen Archivierer. Unter Unix/Linux verwenden wir da normalerweise tar.



  • Vielen Dank 😃 😃

    Haben dann der LZMA SDK und die xz-utils die selbe Kompressionsrate ?

    LZMA kann also gar nicht mehrere in einem Archiv ?
    Wäre es dann gut, alle lzma-komprimierten in eine ZIP zu packen, oder lohnt sich das nicht (die Alternative wären Ordner) ?

    Und wie kompiliere ich die xz-utils jetzt zu einer lib ?
    Wäre echt praktisch, wenn der Compiler die .a annehmen würde 🙄

    Entwickelst du die xz-Utils eigentlich ? 😮



  • DarkShadow44 schrieb:

    Vielen Dank 😃 😃

    Haben dann der LZMA SDK und die xz-utils die selbe Kompressionsrate ?

    LZMA kann also gar nicht mehrere in einem Archiv ?
    Wäre es dann gut, alle lzma-komprimierten in eine ZIP zu packen, oder lohnt sich das nicht (die Alternative wären Ordner) ?

    Und wie kompiliere ich die xz-utils jetzt zu einer lib ?
    Wäre echt praktisch, wenn der Compiler die .a annehmen würde 🙄

    Entwickelst du die xz-Utils eigentlich ? 😮

    xz-utils verwendet standardmässig LZMA2. Das ist eine Weiterentwicklung von LZMA. Aber frage mich nicht, was da geändert wurde. Ich entwickle die xz-utils nämlich nicht 😉 .

    In ein ZIP zu packen wäre eigentlich doppelt gemoppelt. Zip ist ein Dateiformat, welches sowohl archiviert als auch komprimiert (mit zlib übrigens). Tar wäre das richtige Verfahren. Ich kenne aber keine Implementierung für tar.

    Eine Variante wäre das zim-Format. Es wird in erster Linie für offline Wikipedia entwickelt aber man kann dort im prinzip beliebige Daten speichern. Es komprimiert bereits heute deutlich besser als zip. Momentan verwendet es bzip2, aber wir arbeiten daran, lzma zu unterstützen (daher die streams). Lzma hat zwar in tests keine höheren Komprimierraten als bzip2 gezeigt, aber es lässt sich deutlich schneller dekomprimieren.



  • Ich will das Ganze halt für die Speicherung von Maps/Models/... nutzen.
    So wie Quake mit .pk3, was ja auch nur ZIPs sind 😉

    Welches von den Verfahren/Methoden (bzw. Kominationen) würdest du mir dafür empfehlen ?



  • DarkShadow44 schrieb:

    Ich will das Ganze halt für die Speicherung von Maps/Models/... nutzen.
    So wie Quake mit .pk3, was ja auch nur ZIPs sind 😉

    Welches von den Verfahren/Methoden (bzw. Kominationen) würdest du mir dafür empfehlen ?

    Was sind Maps/Models? Und .pk3 kenne ich nicht. Von Quake habe ich immerhin mal was gehört.

    Spricht was gegen Zip? Zip ist gar nicht so schlecht. Du findest für Zip einfach am meisten Tools und Bibliotheken. Eventuell bekommst Du zwar bessere Komprimierraten mit Lzma oder bzip2, aber wenn Zip ausreicht, würde ich an Deiner Stelle das nehmen.



  • Was sind Maps/Models? Und .pk3 kenne ich nicht

    Models sind 3D-'Sprites', also die Form der 3D-Objekte.
    Maps sind dann die karten, welche Objekte also Wo stehen 😉

    Quake verwendet .pk3, also umbennate ZIPs, in denen viele Dateien zusammengefasst sind.
    So was will ich auch nutzen, da das Speicherplatz spart und ich nicht so viele einzelne Dateien brauche.

    Ich wollte halt die bestmöglichen Kompressionsraten, und dafür eignet sich LZMA halt am Besten.
    Meine meisten Dateien sind aber sowieso "Text"-Dateien, also Strings, Integers und Trennzeichen.

    Bei der zlib finde ich allerdings auch keine statische Version (die sich mit VS C++ linken lässt), und ich will keine DLL-Sammlungen.
    Außerdem will ich möglichst die aktuellste Version, deshalb würde ich gern den Quellcode selbst kompilieren, was aber nie klappt. 😡

    Wüsstest du vielleicht eine statische Version der zlib ?
    Und wie stark unterscheiden sich eigentlich lzma/2 und deflate(zip) ?



  • Also ich habe kein Windows. Ich verwende zu Hause ausschliesslich Linux. Auf der Arbeit haben wir Linux und AIX. Wie Du da zu deinen Libraries für Windows kommst, kann ich Dir nicht beantworten. Allerdings wirst Du mit Sicherheit mehr zu zip als zu lzma finden.

    Es hört sich nicht so an, als käme es Dir auf das letzte Byte an. Mit Zip wirst Du sicher ausreichend hohe Kompressionsraten erhalten.



  • Hi, ich bins noch mal...
    Wisst ihr wie ich mit minizip + zlib Ordner in der .zip anlegen kann ??


Log in to reply