在.net中压缩和解压缩,并使用零解压缩数组

时间:2010-02-16 07:33:40

标签: c# .net

我正在尝试压缩和解压缩内存流以通过tcp连接发送它。 在下面的代码快照中,我在压缩后立即进行解压缩,以使其首先工作。 我做了什么我最终得到了一个没有压缩的缓冲区,其中包含零和线  int read = Decompress.Read(buffie,0,buffie.Length); 似乎读取了0个字节。

有没有人知道出了什么问题?

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();
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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();
        }
    }
}
相关问题