Frage

Ich frage mich, ob jemand etwas Licht auf ein Problem vergießen, die mich verrückt fahren:

Ich schreibe eine Kompression Dekompression Testklasse. Um zu testen, ich bin Serialisierung einen Datensatz zu einem Speicherstrom, Komprimieren und Dekomprimieren es und die Ergebnisse zu vergleichen.

Die Kompression ist in Ordnung, aber Uncompression ist, wo es den Schmutz trifft. Dies ist die decompress Funktion:

    public static Stream GetUncompressedStreamCopy(Stream inStream)
    {
      Stream outStream = new MemoryStream();

      inStream.Position = 0;

      DeflateStream uncompressStream = new DeflateStream(inStream, 
        CompressionMode.Decompress, true);

      byte[] buffer = new byte[65536];

      int totalread = 0;
      int bytesread = 0;


      do {
        bytesread = uncompressStream.Read(buffer, 0, buffer.Length);
        totalread += bytesread;
        outStream.Write(buffer, 0, bytesread);
        Console.WriteLine("bytesRead: [{0}]\t outStream.Length [{1}]",
        bytesread, outStream.Length);
      } while (bytesread > 0);


      Console.WriteLine("total bytes read [{0}]", totalread);
      outStream.Flush();
      return outStream;
}

Mit einem Puffer der Größe 65.536 der dekomprimierte Strom liefert immer einen Byte kleiner als es dekomprimiert wurde.

Nun, das bringt mich auf die zweite Frage, die, mit denen ich zu kämpfen. Bei einigen Puffergrößen, gibt uncompressStream.Read 0, obwohl es noch komprimierte Daten extrahieren gelassen.

Für diese Fälle deflateStream.Read (n) nur einmal in der do {} Schleife und kehrt dann ein unkomprimiertes Stream buffer gleich, ob Sie die Puffergröße durch ein einzelnes Byte erhöhen alles gut ist (mit Ausnahme des fehlenden Byte) .

Ausgabe für Puffergröße 65536: (Original unkomprimierte Daten 207833)

bytesRead: [65536]       outStream.Length [65536]
bytesRead: [65536]       outStream.Length [131072]
bytesRead: [58472]       outStream.Length [189544]
bytesRead: [18288]       outStream.Length [207832]
bytesRead: [0]           outStream.Length [207832]
total bytes read [207832]

Puffergröße von 189.544 (einige magische Zahl, wobei die Code Tanks)

bytesRead: [189544]      outStream.Length [189544]
bytesRead: [0]           outStream.Length [189544]
total bytes read [189544]
Unompressed stream size 189544

Beachten Sie auch die 3. Lesen von Puffergröße 65536 ex: bytesread: [58472] Offensichtlich dies auch 65536 sein sollte, da es immer noch Daten auf dem Puffer links

Alle Ideen werden stark geschätzt.

tia

  • Jaco
War es hilfreich?

Lösung

Sie sollten immer rufen Sie Close () auf Kompression Ströme. Bitte beachten Sie, dass Flush () ist nicht genug . Ich vermute, dass wegen dieser abgelassenen Strom fehlt Daten.

Andere Tipps

Meine psychischen Kräfte sagt mir, dass Sie in der Tat eine Arbeits Dekompression Implementierung haben, haben aber vergessen, bevor die Kompression Strom zu spülen.

Nun, ich könnte nicht Ihr Problem erkennen, aber einigen Code folge ich vor einiger Zeit schrieb für ICSharpCode .SharpZipLib ;

byte[] compressedData;
using(MemoryStream ms = new MemoryStream())
{
    Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION, true);
    Stream s = new DeflaterOutputStream(ms, deflater);
    s.Write(sendData, 0, sendData.Length);
    s.Close();
    compressedData = (byte[])ms.ToArray();
}

// ...

MemoryStream inflated = new MemoryStream();
using (Stream inflater = new InflaterInputStream(
    inputStream, new Inflater(true)))
{
    int count = 0;
    byte[] deflated = new byte[4096];
    while ((count = inflater.Read(deflated, 0, deflated.Length)) != 0)
    {
        inflated.Write(deflated, 0, count);
    }
    inflated.Seek(0, SeekOrigin.Begin);
}
byte[] content = new byte[inflated.Length];
inflated.Read(content, 0, content.Length);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top