jos*_*736 8 c# .net-4.0 deflatestream
所以这是一个奇怪的.我有这个方法来采取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());
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将返回一个空字符串,除非我添加第二个调用ds.CopyTo(inflate).(WTF?)
...
using (var ds = new DeflateStream(orig, CompressionMode.Decompress))
{
ds.CopyTo(inflate);
ds.CopyTo(inflate);
return Encoding.ASCII.GetString(inflate.ToArray());
}
...
Run Code Online (Sandbox Code Playgroud)
(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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
当压缩字节不完整时(即,并非所有块都被写出),就会发生这种情况.
如果我使用带有以下Decompress方法的Base64Compress,我将得到一个带有"Unknown block type"消息的InvalidDataException.流可能已损坏.
解压缩
public static string Decompress(Byte[] bytes)
{
using (var uncompressed = new MemoryStream())
using (var compressed = new MemoryStream(bytes))
using (var ds = new DeflateStream(compressed, CompressionMode.Decompress))
{
ds.CopyTo(uncompressed);
return Encoding.ASCII.GetString(uncompressed.ToArray());
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,使用以下Compress方法时,一切都按预期工作
public Byte[] Compress(Byte[] bytes)
{
using (var memoryStream = new MemoryStream())
{
using (var deflateStream = new DeflateStream(memoryStream, CompressionMode.Compress))
deflateStream.Write(bytes, 0, bytes.Length);
return memoryStream.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
更新
哎呀,愚蠢的我......在处理DeflateStream之前你不能ToArray内存流(因为实际上没有实现flush(和Deflate/GZip压缩数据块);最后一个块只写在close/dispose上.
重写压缩为:
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);
}
return Convert.ToBase64String(ms.ToArray());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8112 次 |
| 最近记录: |