【问题标题】:Using Gzip to compress/decompress an array of bytes使用 Gzip 压缩/解压缩字节数组
【发布时间】:2016-12-01 11:07:08
【问题描述】:

我需要压缩一个字节数组。所以我写了这个 sn-p :

 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();
            }
        }
    }

问题是我得到了这个输出:

不明白为什么压缩后的数组比解压后的大!

有什么想法吗?

编辑

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

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

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

【问题讨论】:

  • 因为数据太小以至于压缩格式的开销超过了压缩的收益。尝试更多数据。注意:完全随机的数据不会被压缩。
  • @spender 请查看我的编辑并发布您的想法作为答案,谢谢

标签: c# .net arrays byte gzip


【解决方案1】:

压缩文件有标题,它会增加文件大小,当输入大小非常小时,输出可能会更大,如您所见。尝试使用更大的文件。

【讨论】:

    【解决方案2】:

    这是因为数据量太小,以至于压缩格式的开销超过了压缩的收益。

    尝试更多数据。

    如果您完全压缩了随机数据(或已压缩的数据,例如 jpeg),您将永远不会获得任何显着收益。但是字符串new String('*',1000000) 会很好地压缩。

    GZIP 增加了至少 18 个字节,因此任何低于或略高于此大小且易于压缩的内容都不会受益。

    这是一个对 GZIP 进行深入探讨的有趣问题:What's the most that GZIP or DEFLATE can increase a file size?

    【讨论】:

      最近更新 更多