正在GZipStream中设置缓冲区大小

本文关键字:缓冲区 设置 GZipStream 正在 | 更新日期: 2023-09-27 18:29:44

我在c#中编写了一个轻量级代理。当我解码gzip contentEncoding时,我注意到如果我使用小的缓冲区大小(4096),则流的解码部分取决于输入的大小。这是我的代码中的一个错误还是使它工作所需的东西?我将缓冲区设置为10MB,它运行良好,但违背了我编写轻量级代理的目的。

 response = webEx.Response as HttpWebResponse;
 Stream input = response.GetResponseStream();
 //some other operations on response header
 //calling DecompressGzip here

private static string DecompressGzip(Stream input, Encoding e)
    {

        StringBuilder sb = new StringBuilder();
        using (Ionic.Zlib.GZipStream decompressor = new Ionic.Zlib.GZipStream(input, Ionic.Zlib.CompressionMode.Decompress))
        {
           // works okay for [1024*1024*8];
            byte[] buffer = new byte[4096];
            int n = 0;
                do
                {
                    n = decompressor.Read(buffer, 0, buffer.Length);
                    if (n > 0)
                    {
                        sb.Append(e.GetString(buffer));
                    }
                } while (n > 0);
        }
        return sb.ToString();
    }

正在GZipStream中设置缓冲区大小

实际上,我想明白了。我想使用字符串生成器会导致问题;相反,我使用了一个内存流,它运行得很好。

private static string DecompressGzip(Stream input, Encoding e)
    {
        using (Ionic.Zlib.GZipStream decompressor = new Ionic.Zlib.GZipStream(input, Ionic.Zlib.CompressionMode.Decompress))
        {
            int read = 0;
            var buffer = new byte[4096];
            using (MemoryStream output = new MemoryStream())
            {
                while ((read = decompressor.Read(buffer, 0, buffer.Length)) > 0)
                {
                    output.Write(buffer, 0, read);
                }
                return e.GetString(output.ToArray());
            }

        }
    }