【发布时间】:2010-11-11 20:27:41
【问题描述】:
所以这里有一个奇怪的。我有这个方法来获取 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) 添加第二个调用。 (WTF?)
...
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());
}
}
}
【问题讨论】:
-
这很有趣。当您将两个
ds.CopyTo()中的第一个替换为ds.Read(...)时会发生什么?第一个CopyTo()触发读取流的页脚。Read()也应该这样做。只是想知道。 -
你确定它是 deflate 压缩的,而不是 gzip 压缩的吗?您确定 deflate(或 gzip?)数据前面没有其他内容吗?
-
@Pieter:
.Read()具有相同的效果——它返回0,但会导致对CopyTo()的下一次调用起作用。 -
@nos:是的。我用 DeflateStream 生成了数据。我还使用了一个外部工具来测试我的 Compress 方法生成的数据,它没有任何抱怨。我也会发布压缩方法。
-
如果压缩流的最后一个块没有完全写出(即不完整),我之前已经看到过这种情况;第一次调用读取/复制将失败,后续调用将访问数据。我看看能不能翻出一些参考资料……
标签: c# .net-4.0 deflatestream