C#DeflateStream.Read()给出InvalidDataException

时间:2018-02-08 14:42:29

标签: c# memorystream string-conversion compression deflatestream

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

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

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

Compressed file informations

因此,我应该使用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:在解码时找到有效数据;使用stacktrace

  

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

但是,我仍然认为信息是用" deflate方法"压缩的。 是否有不同/更好/工作的方式来读取数据并在字符串中解压缩?

1 个答案:

答案 0 :(得分:0)

将字符串压缩到MemoryStream上与将文件压缩为zip或类似文件不同。即使在压缩算法相同的情况下,压缩文件也具有头部,解码器可以使用这些头部来获取信息,不仅是关于压缩本身,还有关于其内部文件的信息。

因此,如果您尝试使用DeflateStream函数对文件进行收缩,则标题将不具有预期的格式,这正是DecodeDynamicBlockHeader错误告诉您的。