我需要压缩一个字节数组。所以我写了这个片段:
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";
我得到了不同的结果。那么要压缩的初始数组的最小大小是多少?
答案 0 :(得分:4)
压缩文件有标题,它会增加文件大小,当输入大小非常小时,输出可能会更大,如您所见。尝试使用更大尺寸的文件。
答案 1 :(得分:1)
这是因为数据量太小,压缩格式的开销超过压缩增益。
尝试更多数据。
如果您压缩完全随机数据(或已经压缩的数据,如jpeg),您将永远不会获得任何显着的收益。但是字符串new String('*',1000000)
会非常好地压缩。
GZIP增加了至少18个字节,因此任何低于或略高于此大小且易于压缩的内容都不会受益。
这是一个有趣的问题,可以进一步探讨GZIP:What's the most that GZIP or DEFLATE can increase a file size?