首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法压缩解压缩

无法压缩解压缩
EN

Stack Overflow用户
提问于 2016-01-29 19:39:31
回答 1查看 548关注 0票数 0

我正在尝试通过从WP8文件中读取内容来压缩和解压缩数据。.I无法压缩或decompress.While压缩生成的字符串始终为空。在解压缩时出现错误,因为“在SYSTEM.IO.COMPRESSION.NI.DLL中发生了'System.IO.InvalidDataException‘类型的异常,但在用户代码中没有处理

附加信息:块长度与其补码不匹配。“

代码如下

代码语言:javascript
复制
   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));
            }
        }           
    }

请帮我找出哪里出了问题。

EN

回答 1

Stack Overflow用户

发布于 2016-01-30 15:32:55

如果没有一个好的Minimal, Complete, and Verifiable example的问题,很难说所有的问题都可能是错的。但可以肯定的是,您应该从压缩流中读取数据,而不是写入数据。例如,就像这样:

代码语言:javascript
复制
   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对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35083623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档