schima.hatenablog.comスマートフォン用の表示で見るschima.hatenablog.comこの広告は、90日以上更新していないブログに表示しています。Frameworkでは、System.IO.Compression.GZipStreamやSystem.IO.Compression.DeflateStreamクラスを用いて、データを圧縮・展開することができます。この2つのクラスは全く同じように使えるため、以下ではGZipStreamで話を進めます。以下のコードは、指定したbyte配列をGZipStreamで圧縮してMemoryStreamに出力するサンプルです。MemoryStreamのところをFileStreamにすればメモリではなくファイルに書き出すこともできます。}}このように、ReadやWriteメソッドを使ってデータを読み書きするのですが、これらのメソッドは引数にbyte[]をとります。アンマネージなバイト列の先頭ポインタ(IntPtr)を持っていた場合はそのままでは圧縮できません。これを何とかしてがんばる方法をいくつか考えてみました。展開の方も同様の考え方で行えるため、ここでは割愛します。IntPtrからbyte[]に変換するすぐ思いつくのはこの方法です。バイト列と同じ大きさのマネージbyte配列を別に用意して、Marshal.Copyを使ってコピーし、GZipStreamに丸投げするだけです。}}しかしバイト長sizeが大きい場合は、bufferの確保とコピーのコストが高くつきます。1バイトずつコピーする最もメモリは節約できます。}}しかし処理速度は期待できません。コピーする1と2の折衷案。1バイトごとはやりすぎだけど、一気にコピーするほどメモリは無い。そこで例えば128KBずつコピーする、ということにします。バイト列から読み込むバイト長。残りの長さがLengthを切ったらその残りの長さにする。MessagePack旧仕様のbyte[]に対応させる久しぶりの投稿です。C#におけるMessagePackライブラリの中で...2015-09-06GZip(Deflate)Streamで圧縮するときはCloseを忘れなく狭いスコープでusingしておくのは大事だなと再認識。(1)月別アーカイブはてなブログをはじめよう!Schimaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。