だからここに奇妙なものがあります。Base64でエンコードされた収縮した文字列を取得して、元のデータを返すこのメソッドがあります。
public static string Base64Decompress(string base64data)
{
byte[] b = Convert.FromBase64String(base64data);
using (var orig = new MemoryStream(b))
{
using (var inflate = new MemoryStream())
{
using (var ds = new DeflateStream(orig, CompressionMode.Decompress))
{
ds.CopyTo(inflate);
return Encoding.ASCII.GetString(inflate.ToArray());
}
}
}
}
に2番目の呼び出しを追加しない限り、これは空の文字列を返しますds.CopyTo(inflate)
。(WTF?)
...
using (var ds = new DeflateStream(orig, CompressionMode.Decompress))
{
ds.CopyTo(inflate);
ds.CopyTo(inflate);
return Encoding.ASCII.GetString(inflate.ToArray());
}
...
(Flush
/ Close
/ Dispose
onds
は効果がありません。)
DeflateStream
最初の呼び出しで0バイトをコピーするのはなぜですか?でループを試しましRead()
たが、最初の呼び出しでゼロを返し、2番目の呼び出しで機能します。
更新:これが私がデータを圧縮するために使用している方法です。
public static string Base64Compress(string data, Encoding enc)
{
using (var ms = new MemoryStream())
{
using (var ds = new DeflateStream(ms, CompressionMode.Compress))
{
byte[] b = enc.GetBytes(data);
ds.Write(b, 0, b.Length);
ds.Flush();
return Convert.ToBase64String(ms.ToArray());
}
}
}