Frage

Ich benutze das zlib.net Bibliothek zum Aufblasen von Dateien, die von ZLIB komprimiert werden (vielleicht auf einer Linux -Box). Hier ist, was ich tue:

zlib.ZInputStream zinput =
    new zlib.ZInputStream(File.Open(path, FileMode.Open, FileAccess.Read));

while (stopByte != (data = zinput.ReadByte()))
{
  // check data here
}

zinput.Close();

Die Datenbytes stimmen mit den komprimierten Datenbytes überein, daher muss ich etwas falsch machen.

War es hilfreich?

Lösung 2

Es scheint, dass ich den Fehler gemacht habe, anzunehmen, dass alle virtuellen Methoden überschrieben wurden, was nicht der Fall war. Ich habe Zlib.zinputStream.readbyte () verwendet, der nur der ererbte Stream.readbyte () ist, der nicht aufblasen.

Ich habe stattdessen zlib.zinputstream.read () verwendet, und es hat so funktioniert.

Andere Tipps

Abgesehen davon, dass es für mich in Ordnung aussieht, wenn ich eine Aussage nicht verwendete, um den Stream zu schließen, sieht das in Ordnung aus. Ist die Daten definitiv komprimiert? Können Sie es mit ZLIB auf der Linux -Box dekomprimieren?

Nachdem er sich den Quellcode angesehen hat, ist er ziemlich grässlich - ein Anruf int Read(buffer, offset, length) wird am Ende seine interne nennen int Read() Methode length Zeiten zum Beispiel. Angesichts dieser Art von wackeligem Start bin ich mir nicht sicher, ob ich dem Code besonders stark vertrauen würde, aber ich hätte erwartet, dass er zumindest funktioniert leicht! Haben Sie versucht zu verwenden Shartziplib?

Überspringen des ZLIB -Headers (erste zwei Bytes, 78 9C) und dann die Verwendung der DeflateStream In .NET integriert für mich.

using(var input = File.OpenRead(...))
using(var output = File.Create(...))
{
    // if there are additional headers before the zlib header, you can skip them:
    // input.Seek(xxx, SeekOrigin.Current);

    if (input.ReadByte() != 0x78 || input.ReadByte() != 0x9C)//zlib header
        throw new Exception("Incorrect zlib header");

    using (var deflateStream = new DeflateStream(decryptedData, CompressionMode.Decompress, true))
    {
        deflateStream.CopyTo(output);
    }
}

Der folgende Code könnte euch helfen. Instantieren Sie das Objekt und verwenden Sie die Funktionen.

public class FileCompressionUtility
{
    public FileCompressionUtility()
    {
    }

    public static void CopyStream(System.IO.Stream input, System.IO.Stream output)
    {
        byte[] buffer = new byte[2000];
        int len;
        while ((len = input.Read(buffer, 0, 2000)) > 0)
        {
            output.Write(buffer, 0, len);
        }
        output.Flush();
    }

    public void compressFile(string inFile, string outFile)
    {
        System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
        zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream, zlib.zlibConst.Z_DEFAULT_COMPRESSION);
        System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);
        try
        {
            CopyStream(inFileStream, outZStream);
        }
        finally
        {
            outZStream.Close();
            outFileStream.Close();
            inFileStream.Close();
        }
    }

    public void uncompressFile(string inFile, string outFile)
    {
        int data = 0;
        int stopByte = -1;
        System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
        zlib.ZInputStream inZStream = new zlib.ZInputStream(System.IO.File.Open(inFile, System.IO.FileMode.Open, System.IO.FileAccess.Read));
        while (stopByte != (data = inZStream.Read()))
        {
            byte _dataByte = (byte)data;
            outFileStream.WriteByte(_dataByte);
        }

        inZStream.Close();
        outFileStream.Close();
    }
}

Schauen Sie sich den Beispielcode genauer an, er kopiert Daten von einem regulären FileStream zum ZoutputStream. Die Dekompression muss durch diese Schicht stattfinden.

private void decompressFile(string inFile, string outFile)
{
    System.IO.FileStream outFileStream = new System.IO.FileStream(outFile, System.IO.FileMode.Create);
    zlib.ZOutputStream outZStream = new zlib.ZOutputStream(outFileStream);
    System.IO.FileStream inFileStream = new System.IO.FileStream(inFile, System.IO.FileMode.Open);          
    try
    {
        CopyStream(inFileStream, outZStream);
    }
    finally
    {
        outZStream.Close();
        outFileStream.Close();
        inFileStream.Close();
    }
}

Ich hatte kürzlich das Unglück, Dokumente zu dienen, die zuvor PHP mit einer Vielzahl von Browsern und Plattformen, einschließlich IE7, mithilfe von PHP ausgewiesen wurden. Nachdem ich herausgefunden hatte, dass die Dokumente zlibiert wurden und nicht gzip'd (wie damals angenommen wurde), benutzte ich Shartziplib Auf folgende Weise in .NET Framework v4 (nutzen Stream.copyto):

public static byte[] DecompressZlib(Stream source)
{
    byte[] result = null;
    using (MemoryStream outStream = new MemoryStream())
    {
        using (InflaterInputStream inf = new InflaterInputStream(source))
        {
            inf.CopyTo(outStream);
        }
        result = outStream.ToArray();
    }
    return result;
}

Ich dachte, ich würde es hierher bringen, falls jemand Hilfe bei den Klassen braucht, um sie von Sharpziplib zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top