2010-02-16 93 views
0

我试图压缩和解压缩内存流发送它通过TCP连接。 在下面的代码中,我会在压缩之后立即进行解压缩,以使其首先工作。 我做了什么我最终与一个devompressed缓冲区机智全零和在行 int read = Decompress.Read(buffie,0,buffie.Length); 似乎读取了0个字节。压缩和解压在.net结束与零解压数组

有没有人有线索有什么问题?

bytesRead = ms.Read(buf, 0, i); 

MemoryStream partialMs = new MemoryStream(); 
GZipStream gZip = new GZipStream(partialMs, CompressionMode.Compress); 

gZip.Write(buf, 0, buf.Length); 

partialMs.Position = 0; 

byte[] compressedBuf = new byte[partialMs.Length]; 

partialMs.Read(compressedBuf, 0, (int)partialMs.Length); 

partialMs.Close(); 

byte[] gzBuffer = new byte[compressedBuf.Length + 4]; 
System.Buffer.BlockCopy(compressedBuf, 0, gzBuffer, 4, compressedBuf.Length); 
System.Buffer.BlockCopy(BitConverter.GetBytes(buf.Length), 0, gzBuffer, 0, 4); 

using (MemoryStream mems = new MemoryStream()) 
{ 
    int msgLength = BitConverter.ToInt32(gzBuffer, 0); 

    byte[] buffie = new byte[msgLength]; 
    mems.Write(gzBuffer, 4, gzBuffer.Length - 4); 
    mems.Flush(); 
    mems.Position = 0; 

    using (GZipStream Decompress = new GZipStream(mems, CompressionMode.Decompress, true)) 
    { 
     int read = Decompress.Read(buffie, 0, buffie.Length); 
     Decompress.Close(); 
    } 
} 
+0

PS:发布审查断码的预期和接受。发布_incomplete_ _broken_代码通常会让你无处可寻。这就像打电话给医生,问他你的猫有什么问题。只是说... ;-) – 2010-02-16 08:07:37

回答

1

您的实施可能会使用一些工作。似乎有一些混淆,哪些流应该用在哪里。这里是工作的例子,让你开始..在这个MSDN page


底部

看到用户的内容

var original = new byte[65535]; 
var compressed = GZipTest.Compress(original); 
var decompressed = GZipTest.Decompress(compressed); 

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

public class GZipTest 
{ 
    public static byte[] Compress(byte[] uncompressedBuffer) 
    { 
     using (var ms = new MemoryStream()) 
     { 
      using (var gzip = new GZipStream(ms, CompressionMode.Compress, true)) 
      { 
       gzip.Write(uncompressedBuffer, 0, uncompressedBuffer.Length); 
      } 
      byte[] compressedBuffer = ms.ToArray(); 
      return compressedBuffer; 
     } 
    } 

    public static byte[] Decompress(byte[] compressedBuffer) 
    { 
     using (var gzip = new GZipStream(new MemoryStream(compressedBuffer), CompressionMode.Decompress)) 
     { 
      byte[] uncompressedBuffer = ReadAllBytes(gzip); 
      return uncompressedBuffer; 
     } 
    } 

    private static byte[] ReadAllBytes(Stream stream) 
    { 
     var buffer = new byte[4096]; 
     using (var ms = new MemoryStream()) 
     { 
      int bytesRead = 0; 
      do 
      { 
       bytesRead = stream.Read(buffer, 0, buffer.Length); 
       if (bytesRead > 0) 
       { 
        ms.Write(buffer, 0, bytesRead); 
       } 
      } while (bytesRead > 0); 

      return ms.ToArray(); 
     } 
    } 
} 
1

你不关闭GzipStream你写,所以它可能是所有缓冲。我建议你在写完数据后关闭它。

顺便说一下,您可以比当前代码更容易地从MemoryStream中获取数据:使用MemoryStream.ToArray

+0

你是对的,乔恩,仔细看看发布的代码将揭示一些更基本的问题。 – 2010-02-16 08:09:28