1

我想解压缩一个压缩字符串,以便字符串变得可用。

我使用函数 WebClient.DownloadData(String) 成功地将下载文件的内容提取到一个字节数组中。

使用 deflate 方法对字符进行逻辑压缩,因为当我下载文件(以不同的扩展名)时,7-Zip 会提供此信息:

压缩文件信息

因此,我应该使用 DeflateStream 类来解码字符串,使用函数 Read(byte[] array, int offset, int count) ;读取 MemoryStream。

我使用了一个可以在网上找到的简单功能:

public string UnzipString2(byte[] byteArrayCompressedContent)
        {
            try
            {
                using (var memoryStream = new MemoryStream())
                {
                    int dataLength = BitConverter.ToInt32(byteArrayCompressedContent, 0);
                    memoryStream.Write(byteArrayCompressedContent, 4, byteArrayCompressedContent.Length - 4);
                    memoryStream.Position = 0;

                    var buffer = new byte[dataLength];

                    using (var deflateStream = new DeflateStream(memoryStream, System.IO.Compression.CompressionMode.Decompress))
                    {
                        deflateStream.Read(buffer, 0, buffer.Length);
                        deflateStream.Close();
                    }
                    return Encoding.UTF8.GetString(buffer);
                }
            }
            catch (Exception e)
            {
                return "";
            }
        }

当我们调用 Read() 函数时,它给出了一个 InvalidDataException :在解码时发现有效数据;使用堆栈跟踪

在 System.IO.Compression.Inflater.DecodeDynamicBlockHeader()\r\n 在 System.IO.Compression.Inflater.Decode()\r\n 在 System.IO.Compression.Inflater.Inflate(Byte[] 字节,Int32 偏移量, Int32 长度)\r\n 在 System.IO.Compression.DeflateStream.Read(Byte[] 数组, Int32 偏移量, Int32 计数)\r\n

但是,我仍然认为信息是用“放气方法”压缩的。 是否有不同/更好/有效的方式来读取数据并将其解压缩为字符串?

4

1 回答 1

0

将字符串压缩到 MemoryStream 与将文件压缩为 zip 或类似文件不同。即使在压缩算法相同的情况下,压缩文件也有可以被解码器用来获取信息的标题,不仅是关于压缩本身的信息,还有关于它里面的文件的信息。

因此,如果您尝试使用 DeflateStream 函数对文件进行放气,则标头不会具有预期的格式,这正是 DecodeDynamicBlockHeader 错误告诉您的内容。

于 2018-02-08T15:18:05.840 回答