GZipStreamとDeflateStreamな解凍すべてのバイト
-
06-07-2019 - |
質問
また必要にな画像の圧縮す。当期純なっ用します。純GZipStreamクラス(またはDeflateStream).しかしこれらの圧縮解除に必ずしも成功した時に画像が解凍微細な、時には、GDI+エラーであることが壊れる可能性があります。
調査の結果を発行することを見いだし,その減圧したわけではないことがわかるすべてのバイトで圧縮されます。ない圧縮2257974バイト思いがあり、帰りのみ2257870バイト数(実数)
最も面白い事がある時。ったこの小さな試験方法が圧縮みが10バイトをやってきて、自分のやりたいないくものです。
かるととも圧縮授業GZipStreamとDeflateStreamんのダブルチェックマーコードできます。もし位置決めのストリーム0フラッシングの流れがない。
こちらは自分のコード:
public static void TestCompression()
{
byte[] test = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
byte[] result = Decompress(Compress(test));
// This will fail, result.Length is 0
Debug.Assert(result.Length == test.Length);
}
public static byte[] Compress(byte[] data)
{
var compressedStream = new MemoryStream();
var zipStream = new GZipStream(compressedStream, CompressionMode.Compress);
zipStream.Write(data, 0, data.Length);
return compressedStream.ToArray();
}
public static byte[] Decompress(byte[] data)
{
var compressedStream = new MemoryStream(data);
var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
var resultStream = new MemoryStream();
var buffer = new byte[4096];
int read;
while ((read = zipStream.Read(buffer, 0, buffer.Length)) > 0) {
resultStream.Write(buffer, 0, read);
}
return resultStream.ToArray();
}
解決
必要なもの Close()
の ZipStream
追加後にしたいデータ圧縮;するものではなく、バッファの暗黙のバイトの内容の場合にも Flush()
る必要が書かれています。
より一般的には、 Stream
は IDisposable
, できることも using
各---(yesをもたらすであろうと確信してお MemoryStream
がなくなるわけではありませんなデータが得られないときには、いくつかのこの癖、食い込みでその他の Stream
ます。
public 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();
}
}
public static byte[] Decompress(byte[] data)
{
using(var compressedStream = new MemoryStream(data))
using(var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
using (var resultStream = new MemoryStream())
{ ... }
}
[編集:更新を再コメント]
切り替わらない場合は using
ようなもの MemoryStream
-この楽しい一日の投票に左右のフェンス:がultimatey...
(用法と修辞的-私の答えは...)が MemoryStream
データエスクローエージェントでbyte[](有。純額)?それはメモリマップファイルが保有するOS)?
その理由ん using
ですのでこのような知識の内部実装の詳細を変更すコードに対する公開APIるだっ法に封止.は、公開APIには:私 IDisposable
;you"の"me;そのため、お仕事 Dispose()
いきます。
他のヒント
も守らなければいけないのDeflateStreamです。IO.圧縮せずに実施で最も効率的なdeflateアルゴリズムです。もよろしくお願いします。あのBCL GZipStreamとDeflateStream;で実施され、完全に管理されたスにも対応できるようになってzlibコードを実行するように{Deflate、GZip}流が重要です。[なClose()ストリームにはbytestream.]
これらのストリームに授業に出荷されたのDotNetZlib組立サンプルは、こちらからDotNetZip分布 http://DotNetZip.codeplex.com/.