使用Gzip压缩/解压字节数组

16

我需要压缩一个字节数组。因此我写了这段代码:

 class Program
    {
        static void Main()
        {
            var test = "foo bar baz";

            var compressed = Compress(Encoding.UTF8.GetBytes(test));
            var decompressed = Decompress(compressed);
            Console.WriteLine("size of initial table = " + test.Length);
            Console.WriteLine("size of compressed table = " + compressed.Length);
            Console.WriteLine("size of  decompressed table = " + decompressed.Length);
            Console.WriteLine(Encoding.UTF8.GetString(decompressed));
            Console.ReadKey();
        }

        static byte[] Compress(byte[] data)
        {
            using (var compressedStream = new MemoryStream())
            using (var zipStream = new GZipStream(compressedStream, CompressionMode.Compress))
            {
                zipStream.Write(data, 0, data.Length);
                zipStream.Close();
                return compressedStream.ToArray();
            }
        }

        static byte[] Decompress(byte[] data)
        {
            using (var compressedStream = new MemoryStream(data))
            using (var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
            using (var resultStream = new MemoryStream())
            {
                zipStream.CopyTo(resultStream);
                return resultStream.ToArray();
            }
        }
    }
问题在于我得到了这个输出:

output

我不明白为什么压缩后的数组大小大于解压后的数组大小!

有什么想法吗?

编辑

在@spender的评论之后:如果我更改test字符串,例如:

var test = "foo bar baz very long string for example hdgfgfhfghfghfghfghfghfghfghfghfghfghfhg";

我得到了不同的结果。那么,需要压缩的初始数组的最小大小是多少?


2
由于数据太小,压缩格式的开销超过了压缩的收益。尝试更多的数据。注意:完全随机的数据不会被压缩。 - spender
@spender请看我的编辑并将您的想法发布为答案,谢谢。 - Lamloumi Afif
2个回答

9

压缩文件包含头部信息,这会增加文件大小。当输入的文件很小的时候,输出的文件甚至可能比原始文件还要大。可以尝试使用更大的文件进行压缩来验证。


4
这是因为数据量太小,压缩格式的开销超过了压缩的收益。
尝试使用更多数据。
如果你压缩完全随机的数据(或已经压缩的数据,如jpeg),你永远不会获得任何显著的收益。然而,字符串new String('*',1000000)将能够很好地压缩。
GZIP至少会增加18个字节,所以任何低于或略高于这个大小且易于压缩的内容都不会受益。
这里有一个有趣的问题,进一步探讨了GZIP:GZIP或DEFLATE最多可以增加多少文件大小?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接