【发布时间】:2015-09-23 14:53:53
【问题描述】:
我正在使用以下方法来压缩我的回复内容:
(考虑_compression = CompressionType.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;
}
}
但是,此方法返回的字节数比原始内容多。
例如,我的初始内容是 42 字节长,而生成的 compressedBytes 数组的大小为 62 字节。
我在这里做错了吗?压缩如何产生更多字节?
【问题讨论】:
-
每个无损压缩算法必须有一些值可以生成比原始未压缩值更长的压缩值。见:en.wikipedia.org/wiki/Lossless_compression#Limitations
标签: c# asp.net .net stream gzip