【问题标题】:Unable to compress decompress无法压缩解压
【发布时间】:2016-01-29 11:39:30
【问题描述】:

我正在尝试通过从 WP8 中的文件读取内容来压缩和解压缩数据。我无法压缩或解压缩。虽然压缩结果字符串始终为空。解压时出现错误为“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));
            }
        }           
    }

请帮我找出问题所在。

【问题讨论】:

    标签: c# windows-phone-8.1 compression http-compression deflatestream


    【解决方案1】:

    如果没有问题,包括一个好的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 对象。

    【讨论】:

    • 感谢您的回复:)。我试过用flush()。它没有帮助。我已经更新了代码。
    • 您的主要问题与冲洗/关闭无关。您根本没有正确解压缩。就压缩而言,单独冲洗无济于事;您需要 关闭 流。在您完成之前,无法最终确定压缩数据; DeflateStream 不知道你已经完成了数据压缩。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多