Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用GZipStream压缩会产生更多字节_C#_Asp.net_.net_Stream_Gzip - Fatal编程技术网

C# 使用GZipStream压缩会产生更多字节

C# 使用GZipStream压缩会产生更多字节,c#,asp.net,.net,stream,gzip,C#,Asp.net,.net,Stream,Gzip,我使用以下方法压缩我的回复内容: (考虑压缩=压缩类型.GZip) 专用异步任务压缩同步(HttpContent) { if(content==null)返回null; 字节[]压缩字节; 使用(MemoryStream outputStream=new MemoryStream()) { 使用(Stream compressionStream=GetCompressionStream(outputStream)) 使用(Stream contentStream=await content.Re

我使用以下方法压缩我的回复内容:

(考虑压缩=压缩类型.GZip)

专用异步任务压缩同步(HttpContent)
{
if(content==null)返回null;
字节[]压缩字节;
使用(MemoryStream outputStream=new MemoryStream())
{
使用(Stream compressionStream=GetCompressionStream(outputStream))
使用(Stream contentStream=await content.ReadAsStreamAsync())
等待contentStream.CopyToAsync(压缩流);
compressedBytes=outputStream.ToArray();
}
content.Dispose();
HttpContent compressedContent=新的ByteArrayContent(压缩字节);
compressedContent.Headers.ContentEncoding.Add(GetContentEncoding());
返回压缩内容;
}
私有流GetCompressionStream(流输出)
{
开关(压缩)
{
case CompressionType.GZip:{返回新的GZipStream(输出,CompressionMode.Compress);}
大小写压缩类型.Deflate:{返回新的DeflateStream(输出,CompressionMode.Compress);}
默认值:返回null;
}
}
私有字符串GetContentEncoding()
{
开关(压缩)
{
case CompressionType.GZip:{返回“GZip”;}
大小写压缩类型.Deflate:{返回“Deflate”;}
默认值:返回null;
}
}
但是,此方法返回的字节比原始内容多

例如,我的初始内容长度为42字节,生成的
compressedBytes
数组大小为62字节


我做错什么了吗?压缩如何生成更多字节?

您不一定做错了什么。您必须考虑到这些压缩格式总是需要一点空间来存放标题信息。这可能就是它增长了几个字节的原因

在正常情况下,压缩的数据量会更大。在这种情况下,与通过压缩数据获得的收益相比,与报头数据相关的开销变得不明显


但是,在这种情况下,由于未压缩的数据非常小,因此在压缩过程中可能得不到多少好处,因此这是少数几个可以实际注意到头占用空间的实例之一。

使用gzip压缩小文件时,元数据(对于压缩文件本身)可能会导致增加的字节数大于压缩保存的字节数

见:

信不信由你,有些情况下GZIP可以增加资产的规模。通常,当资源非常小并且GZIP字典的开销高于压缩节省时,或者如果资源已经被很好地压缩,就会发生这种情况


对于如此小的大小,压缩开销实际上会使文件变大,这并不奇怪。对此进行了更详细的解释。

每个无损压缩算法都必须有一些值,这些值生成的压缩值比原始未压缩值更长。见:
private async Task<HttpContent> CompressAsync(HttpContent content)
{
     if(content == null) return null;
     byte[] compressedBytes;
     using(MemoryStream outputStream = new MemoryStream())
     {
         using (Stream compressionStream = GetCompressionStream(outputStream))
         using (Stream contentStream = await content.ReadAsStreamAsync())
             await contentStream.CopyToAsync(compressionStream);

         compressedBytes = outputStream.ToArray();
     }

     content.Dispose();

     HttpContent compressedContent = new ByteArrayContent(compressedBytes);
     compressedContent.Headers.ContentEncoding.Add(GetContentEncoding());
     return compressedContent;
}

private Stream GetCompressionStream(Stream output)
{
    switch (_compression)
    {
        case CompressionType.GZip: { return new GZipStream(output, CompressionMode.Compress); }
        case CompressionType.Deflate: { return new DeflateStream(output, CompressionMode.Compress); }
        default: return null;
    }
}

private string GetContentEncoding()
{
    switch (_compression)
    {
        case CompressionType.GZip: { return "gzip"; }
        case CompressionType.Deflate: { return "deflate"; }
        default: return null;
    }
}