簡體   English   中英

C#DeflateStream.Read()提供InvalidDataException

[英]C# DeflateStream.Read() giving an InvalidDataException

我想解壓縮一個壓縮的字符串,以便字符串可以使用。

我使用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 [] bytes,Int32 offset ,Int32長度)\\ r \\ n在System.IO.Compression.DeflateStream.Read(Byte []數組,Int32偏移量,Int32計數)\\ r \\ n

但是,我仍然認為信息是使用“放氣方法”壓縮的。 是否有其他/更好/可行的方式來讀取數據並將其解壓縮為String?

將字符串壓縮到MemoryStream上與將文件壓縮為zip或類似方法不同。 即使在壓縮算法相同的情況下,壓縮文件也具有標頭,解碼器可以使用這些標頭來獲取信息,這些信息不僅涉及壓縮本身,還涉及其中的文件。

因此,如果您嘗試使用DeflateStream函數縮小文件,則標頭將不會具有預期的格式,這正是DecodeDynamicBlockHeader錯誤告訴您的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM