首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.net endsup中使用解压缩的零数组进行压缩和解压力

在.net endsup中使用解压缩的零数组进行压缩和解压力
EN

Stack Overflow用户
提问于 2010-02-16 15:33:40
回答 2查看 357关注 0票数 0

我正在尝试压缩和解压缩内存流,以便通过tcp连接发送它。在下面的代码片段中,我确实在压缩之后立即进行了解压缩,以便首先让它工作。无论我做什么,我都会得到一个全为零的devompressed缓冲区,并且在int read = Decompress.Read(buffie,0,buffie.Length)行中;似乎读取了0个字节。

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

代码语言:javascript
复制
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();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-02-16 16:04:11

您的实现可能需要一些工作。对于应该在哪里使用哪些流,似乎存在一些混乱。下面是一个可以帮助您入门的工作示例。

查看此MSDN page底部的用户内容

代码语言:javascript
复制
var original = new byte[65535];
var compressed = GZipTest.Compress(original);
var decompressed = GZipTest.Decompress(compressed);

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2010-02-16 15:43:52

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2271259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档