我使用以下方法来压缩我的回复内容:
(考虑_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个字节。
我在这里做错了吗?压缩如何产生更多字节?
答案 0 :(得分:1)
你不一定做错什么。您必须考虑到这些压缩格式总是需要一些空间来存储标头信息。所以这可能就是为什么它增长了几个字节。
在正常情况下,您将压缩大量数据。在这种情况下,与通过压缩数据所获得的收益相比,与标题数据相关联的开销变得难以察觉。
但是,因为在这种情况下,您的未压缩数据非常小,因此您可能在压缩中获得的收益不多,那么这是您可以实际注意到页眉占用空间的少数几个实例之一。
答案 1 :(得分:0)
使用gzip压缩小文件时,元数据(对于压缩文件本身)可能会导致增加大于压缩节省的字节数。
信不信由你,有些情况下GZIP可以增加资产的规模。通常,当资产非常小并且GZIP字典的开销高于压缩节省,或者资源已经被很好地压缩时,就会发生这种情况。
答案 2 :(得分:0)
对于如此小的尺寸,压缩开销实际上可以使文件更大,并且它没什么不寻常的。 Here详细解释了这一点。