C# DeflateStream.Read() дает исключение 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[] байт, смещение Int32 , длина Int32)\r\n в System.IO.Compression.DeflateStream.Read (массив Byte [], смещение Int32, количество Int32)\r\n

Однако я все еще думаю, что информация сжимается с помощью «метода дефляции». Есть ли другой/лучший/рабочий способ чтения данных и распаковки их в строку?


person Gaël    schedule 08.02.2018    source источник


Ответы (1)


Сжатие строки в MemoryStream — это не то же самое, что сжатие файла в виде zip или аналогичного файла. Даже при том, что алгоритм сжатия тот же, сжатый файл имеет заголовки, которые могут использоваться декодером для получения информации не только о самом сжатии, но и о файлах внутри него.

Поэтому, если вы пытаетесь выкачать файл с помощью функции DeflateStream, заголовок не будет иметь ожидаемого формата, о чем вам и говорит ошибка DecodeDynamicBlockHeader.

person legrojan    schedule 08.02.2018
comment
Я думаю, что я не пытаюсь выкачать файл, а MemoryStream из массива байтов, возвращаемых функцией WebClient.DownloadData(). Таким образом, DeflateStream() должен быть уместным? - person Gaël; 08.02.2018
comment
Я не могу знать наверняка, потому что это зависит от вашего источника, но я подозреваю, что если 7zip откроет его, это должен быть сжатый файл, и поэтому вы должны распаковать его с помощью метода / библиотеки распаковки. . - person legrojan; 08.02.2018