.NET 6.0以降、zlibを使うにはZLibStream
を使えば追加のパッケージ無しで簡単にできるみたいです。
圧縮
適当なデータ(今回は「zlibテスト」というUTF8の文字列)を圧縮してみます。ZLibStream
のインスタンスを作るときは、圧縮後のデータを書き込むStreamを渡します。さらにCompressionMode.Compress
を指定し、圧縮モードで動作するようにします。作成したZLibStream
に圧縮元のデータを書き込むことで、zlibで圧縮されたデータが手に入ります。
var data = Encoding.UTF8.GetBytes("zlibテスト");
using var compressed = new MemoryStream();
using (var zlibStream = new ZLibStream(compressed, CompressionMode.Compress))
zlibStream.Write(data, 0, data.Length);
Console.WriteLine(BitConverter.ToString(compressed.ToArray()));
出力結果はこんな感じでした。
78-9C-AB-CA-C9-4C-7A-DC-DC-F6-B8-69-E7-E3-E6-0E-00-32-5A-07-AA
展開
先ほど得られたバイト列から、元の文字列を得られるかを試してみます。ZLibStream
をnewするときには、圧縮後のデータを書き込むStreamを渡します。CompressionMode.Decompress
を指定して展開モードで動作するようにします。
byte[] compressedData = [0x78, 0x9C, 0xAB, 0xCA, 0xC9, 0x4C, 0x7A, 0xDC, 0xDC, 0xF6, 0xB8, 0x69, 0xE7, 0xE3, 0xE6, 0x0E, 0x00, 0x32, 0x5A, 0x07, 0xAA];
using var compressed = new MemoryStream(compressedData);
using var zlibStream = new ZLibStream(compressed, CompressionMode.Decompress);
using var decompressed = new MemoryStream();
zlibStream.CopyTo(decompressed);
Console.WriteLine(Encoding.UTF8.GetString(decompressed.ToArray()));
出力結果はこんな感じです。ちゃんと元に戻ってます。
zlibテスト
まとめ
圧縮・展開どちらをするにしても、ZlibStream
のコンストラクタの第一引数には圧縮後のデータのStreamを渡す必要があります。ZlibStream
についての記事はあまりないみたいですが、かなり簡単に使える印象でした。