C# 使用GZipStream压缩会产生更多字节
我使用以下方法压缩我的回复内容: (考虑压缩=压缩类型.GZip)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
专用异步任务压缩同步(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;
}
}