title: GZipStream And DeflateStream will not decompress all bytes
body: <p>I was in need of a way to compress images in .net so i looked into using the .net GZipStream class (or DeflateStream). However i found that decompression was not always successful, sometimes the images would decompress fine and other times i would get a GDI+ error that something is corrupted.</p>
  
  <p>After investigating the issue i found that the decompression was not giving back all the bytes it compressed. So if i compressed 2257974 bytes i would sometimes get back only 2257870 bytes (real numbers).</p>
  
  <p>The most funny thing is that sometimes it would work. So i created this little test method that compresses only 10 bytes and now i don't get back anything at all.</p>
  
  <p>I tried it with both compression classes GZipStream and DeflateStream and i double checked my code for possible errors. I even tried positioning the stream to 0 and flushing all the streams but with no luck.</p>
  
  <p>Here is my code:</p>
  
  <pre><code>    public static void TestCompression()
      {
          byte[] test = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  
          byte[] result = Decompress(Compress(test));
  
          // This will fail, result.Length is 0
          Debug.Assert(result.Length == test.Length);
      }
  
      public static byte[] Compress(byte[] data)
      {
          var compressedStream = new MemoryStream();
          var zipStream = new GZipStream(compressedStream, CompressionMode.Compress);
          zipStream.Write(data, 0, data.Length);
          return compressedStream.ToArray();
      }
  
      public static byte[] Decompress(byte[] data)
      {
          var compressedStream = new MemoryStream(data);
          var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
          var resultStream = new MemoryStream();
  
          var buffer = new byte[4096];
          int read;
  
          while ((read = zipStream.Read(buffer, 0, buffer.Length)) &gt; 0) {
              resultStream.Write(buffer, 0, read);
          }
  
          return resultStream.ToArray();
      }
  </code></pre>