这里有一个奇怪的问题。我有一个方法可以将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());
}
}
}
}
如果我不添加第二个调用ds.CopyTo(inflate)
,则会返回一个空字符串(什么鬼?)
...
using (var ds = new DeflateStream(orig, CompressionMode.Decompress))
{
ds.CopyTo(inflate);
ds.CopyTo(inflate);
return Encoding.ASCII.GetString(inflate.ToArray());
}
...
(Flush
/Close
/Dispose
在ds
上没有影响。)
DeflateStream
为什么在第一次调用时会复制0字节?我也尝试用Read()
循环,但它在第一次调用时也返回零,然后在第二次调用时才能工作。
更新:这是我用来压缩数据的方法。
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());
}
}
}