1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#でzlibで圧縮・展開

Posted at

.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についての記事はあまりないみたいですが、かなり簡単に使える印象でした。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?