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

Compressing with GZipStream results in more bytes

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

(考虑 _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;
    }
}

但是,这个方法比原来的内容多returns字节。

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

我是不是做错了什么?压缩如何产生更多字节?

你不一定做错了什么。您必须考虑到这些压缩格式总是需要一些 space 来获取 header 信息。所以这可能就是它增加了几个字节的原因。

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

但是因为在这种情况下,您的未压缩数据非常小,所以您可能不会在压缩过程中获得太多收益,因此这是您可以真正注意到 header 的少数几个实例之一占用 space.

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

参见Googles gzip tips

Believe it or not, there are cases where GZIP can increase the size of the asset. Typically, this happens when the asset is very small and the overhead of the GZIP dictionary is higher than the compression savings, or if the resource is already well compressed.

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