我正在尝试通过从WP8文件中读取内容来压缩和解压缩数据。.I无法压缩或decompress.While压缩生成的字符串始终为空。在解压缩时出现错误,因为“在SYSTEM.IO.COMPRESSION.NI.DLL中发生了'System.IO.InvalidDataException‘类型的异常,但在用户代码中没有处理
附加信息:块长度与其补码不匹配。“
代码如下
public static async void CompressDecompress()
{
//Location of File to be Compressed
string toCompressFileName = "ms-appx:///Assets/data.txt";
StorageFile toCompressFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(toCompressFileName));
Stream toCompressStream = await toCompressFile.OpenStreamForReadAsync();
toCompressStream.Position = 0;
string compressedString = Compress(toCompressStream);
//Location of File to be Decompressed
string toDecompressFileName = "ms-appx:///Assets/zipped_data.txt";
StorageFile toDecompressFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(toDecompressFileName));
Stream toDecompressStream = await toDecompressFile.OpenStreamForReadAsync();
toDecompressStream.Position = 0;
string decompressedString = DeCompress(toDecompressStream);
}
public static string Compress(Stream toCompressStream)
{
using (MemoryStream resultCompressedStream = new MemoryStream())
{
using (DeflateStream compressionStream = new DeflateStream(resultCompressedStream, CompressionMode.Compress))
{
toCompressStream.CopyTo(compressionStream);
toCompressStream.Flush();
return Encoding.UTF8.GetString(resultCompressedStream.ToArray(), 0, Convert.ToInt32(resultCompressedStream.Length));
}
}
}
public static string DeCompress(Stream toDecompressStream)
{
using (MemoryStream resultDeCompressedStream = new MemoryStream())
{
using (DeflateStream decompressionStream = new DeflateStream(toDecompressStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(resultDeCompressedStream);
decompressionStream.Flush();
return Encoding.UTF8.GetString(resultDeCompressedStream.ToArray(), 0, Convert.ToInt32(resultDeCompressedStream.Length));
}
}
}请帮我找出哪里出了问题。
发布于 2016-01-30 15:32:55
如果没有一个好的Minimal, Complete, and Verifiable example的问题,很难说所有的问题都可能是错的。但可以肯定的是,您应该从压缩流中读取数据,而不是写入数据。例如,就像这样:
using (MemoryStream resultDeCompressedStream = new MemoryStream())
{
using (DeflateStream decompressionStream = new DeflateStream(decompressfileStream, CompressionMode.Decompress))
{
decompressionStream.CopyTo(resultDeCompressedStream);
string decompressedString = Encoding.UTF8.GetString(resultDeCompressedStream.ToArray(), 0, Convert.ToInt32(resultDeCompressedStream.Length));
}
}注意:您的代码还使用了datafileStream对象,该对象当然只是原始的未压缩数据文件,并且已经被读取到最后。因此,即使忽略了您滥用DeflateStream的事实,这也不会起作用。我在上面的示例中也解决了这个问题,即通过写入明显的预期输出流,并使用decompressfileStream对象作为DeflateStream的输入。
注意:从你的问题中还不清楚你是否也有压缩方面的问题。但是如果是这样的话,我建议您在复制数据之后显式地刷新/关闭DeflateStream对象。
https://stackoverflow.com/questions/35083623
复制相似问题