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

时间:2015-07-06 12:43:48

标签: c# asp.net .net stream gzip

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

(考虑_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个字节。

我在这里做错了吗?压缩如何产生更多字节?

3 个答案:

答案 0 :(得分:1)

你不一定做错什么。您必须考虑到这些压缩格式总是需要一些空间来存储标头信息。所以这可能就是为什么它增长了几个字节。

在正常情况下,您将压缩大量数据。在这种情况下,与通过压缩数据所获得的收益相比,与标题数据相关联的开销变得难以察觉。

但是,因为在这种情况下,您的未压缩数据非常小,因此您可能在压缩中获得的收益不多,那么这是您可以实际注意到页眉占用空间的少数几个实例之一。

答案 1 :(得分:0)

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

请参阅Googles gzip tips

  

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

答案 2 :(得分:0)

对于如此小的尺寸,压缩开销实际上可以使文件更大,并且它没什么不寻常的。 Here详细解释了这一点。