Frage

ich nicht es. Ich habe einen ähnlichen / gleichen Ansatz seit vielen Jahren jetzt, und nie erlebt.

Aus irgendeinem Grund, dass ich nicht abholen habe bis heute ein GZIP Rundfahrt führt zu 1 oder mehr Bytes abgeschnitten wird oder wenn Daten verstümmelt werden.

Ich schrieb einen einfachen Test, um zu überprüfen, dass etwas anderes nicht beeinflusst.

Das nicht immer mit einer Länge über Mismatch '.

Kann mir jemand entsprechen, dass ich nicht verrückt bin? :)

Danke

leppie

TEST

using System;
using System.Diagnostics;
using System.IO;
using System.IO.Compression;

class Program
{
  const int BUFFER_SIZE = 8192;

  static void Main(string[] args)
  {
    var filename = args[0];
    var filedata = File.ReadAllBytes(filename);
    var cmp = Compress(filedata);
    var dec = Decompress(cmp);

    Assert(filedata, dec);

    Console.ReadLine();
  }

  static void Assert(byte[] orig, byte[] data)
  {
    if (orig.Length != data.Length)
    {
      Debug.Fail("length mismatch");
    }
    for (int i = 0; i < orig.Length; i++)
    {
      Debug.Assert(orig[i] == data[i], "data mismatch");
    }
  }

  static byte[] Compress(byte[] data)
  {
    var input = new MemoryStream(data);
    var output = new MemoryStream();

    var s = new GZipStream(output, CompressionMode.Compress);
    byte[] buffer = new byte[BUFFER_SIZE];
    int read = 0;
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
    {
      s.Write(buffer, 0, read);
    }

    return output.ToArray();
  }

  static byte[] Decompress(byte[] data)
  {
    var input = new MemoryStream(data);
    var s = new GZipStream(input, CompressionMode.Decompress);

    var output = new MemoryStream();
    byte[] buffer = new byte[BUFFER_SIZE];
    int read = 0;
    while ((read = s.Read(buffer, 0, buffer.Length)) > 0)
    {
      output.Write(buffer, 0, read);
    }

    return output.ToArray();
  }
}

Ich habe es versucht, mit der Ströme richtig zu schließen, mit verschiedenen Puffergrößen, die alle das gleiche Ergebnis.

War es hilfreich?

Lösung

OK, das Problem gefunden.

Sie müssen den Druckstrom zu schließen, bevor die Bytes abgerufen werden.

Beispiel:

s.Close();
return output.ToArray();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top