4

私はおかしな心を失いそうです。過去 1 時間、GzipStream で文字列を圧縮しようとしてきましたが、何らかの理由で、バイト配列全体をメモリ ストリームに書き込むことを拒否しています。最初は using ステートメントと関係があると思いましたが、それらを削除しても違いはないようです。

初期設定:

var str = "Here is a relatively simple string to compress";
byte[] compressedBytes;
string returnedData;

var bytes = Encoding.UTF8.GetBytes(str);

正常に動作します (長さ 64 のバイト配列を書き込みます):

using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream()) {
   using (var gs = new GZipStream(mso, CompressionMode.Compress)) {
       msi.CopyTo(gs);
   }

   compressedBytes = mso.ToArray();
}

失敗 (長さ 10 のバイト配列を書き込みます):

using(var mso = new MemoryStream())
using(var msi = new MemoryStream(bytes))
using(var zip = new GZipStream(mso, CompressionMode.Compress))
{
    msi.CopyTo(zip);
    compressedBytes = mso.ToArray();
}

また失敗します (長さ 10 のバイト配列を書き込みます):

var mso = new MemoryStream();
var msi = new MemoryStream(bytes);
var zip = new GZipStream(mso, CompressionMode.Compress);

msi.CopyTo(zip);
compressedBytes = mso.ToArray();

最初のものは機能するが、他の2つではこれらの不完全な配列を取得している理由を誰かが説明できますか? 私の下から何かが処分されていますか?さらに言えば、2 つのメモリストリームを使用しないようにする方法はありますか?

ありがとう、ズームビニ

4

3 に答える 3

2

System.IO.Compression.GZipStream基になるストリームを使用する前に、閉じる (破棄する) 必要があります。

  1. ブロック指向で動作します
  2. チェックサムを含むフッターを記述する必要があります ( Wikipedia のファイル形式の説明を参照してください) 。
于 2013-04-17T00:19:45.670 に答える
1

GZipStream閉じる前に圧縮データを取得しようとしています。ご覧のとおり、これは完全なデータを返しません。最初のものが機能する理由は、破棄されたcompressedBytes = mso.ToArray(); GZipStreamに呼び出しているためです。したがって、テストされていませんが、理論的には、2 番目のコードをこのように少し変更して動作させることができるはずです。

using(var mso = new MemoryStream())
{
   using(var msi = new MemoryStream(bytes))
   using(var zip = new GZipStream(mso, CompressionMode.Compress))
   {
       msi.CopyTo(zip);
   }
   compressedBytes = mso.ToArray();
}
于 2013-04-17T00:15:34.963 に答える