バイトの配列を圧縮する必要があります。だから私はこのスニペットを書きました:
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";
結果が異なります。それで、圧縮される初期配列の最小サイズは何ですか?
圧縮ファイルにはヘッダーがあり、ファイルサイズが大きくなります。入力サイズが非常に小さい場合、出力はさらに大きくなる可能性があります。大きなサイズのファイルで試してください。
これは、データの量が非常に少ないため、圧縮形式のオーバーヘッドが圧縮のゲインを上回るためです。
より多くのデータを試してください。
完全にランダムなデータ(またはjpegなどのすでに圧縮されたデータ)を圧縮した場合、大きなメリットはありません。しかし、文字列new String('*',1000000)
は、本当にうまく圧縮されます。
GZIPは少なくとも18バイトを追加するため、簡単に圧縮できるこのサイズ以下またはこのサイズをわずかに超えるものにはメリットがありません。
GZIPをさらに詳しく調査する興味深い質問を次に示します。 GZIPまたはDEFLATEがファイルサイズを増やすことができる最大のものは何ですか?