Как распаковать сжатую строку GZip на С#?

В настоящее время пытаюсь распаковать сжатую GZip строку, где я использую эту функцию:

private static string Decompress(byte[] bytes)
{
    using (var memoryStream = new MemoryStream(bytes))
    using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
    using (var memoryStreamOutput = new MemoryStream()) 
    {
        gZipStream.CopyTo(memoryStreamOutput);
        var outputBytes = memoryStreamOutput.ToArray();

        string decompressed = Encoding.UTF8.GetString(outputBytes);
        return decompressed;
    }
}

И всякий раз, когда я запускаю код, строка, которую я подключаю при вызове функции, не изменяется там, где она должна быть распакована. Я также пытался использовать StreamReader, но это тоже не сработало. Что случилось?


person Harry the Gamer - AzureX1212    schedule 23.03.2020    source источник
comment
Можете ли вы отредактировать свой вопрос, включив в него некоторые примеры входных и выходных данных, которые воспроизводят вашу проблему?   -  person canton7    schedule 23.03.2020
comment
Вы упоминаете сжатую строку, но ваш код использует массив байтов. Если вы получили строку, как вы создали эти байты? UTF8.GetBytes, Convert.FromBase64String, другое?   -  person Hans Kesting    schedule 23.03.2020


Ответы (1)


Показанный код работает просто отлично, если мы делаем разумные предположения о том, как он был сжат в первую очередь:

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

static class P
{
    static void Main()
    {
        Console.WriteLine(lipsum.Length); // 61125 chars of lipsum (not shown)
        Console.WriteLine(Encoding.UTF8.GetByteCount(lipsum)); // 61125 bytes of lipsum
        var bytes = Compress(lipsum);
        Console.WriteLine(bytes.Length); // 16795 bytes compressed
        var value = Decompress(bytes);
        Console.WriteLine(value.Length); // 61125 bytes again when decompressed
        Console.WriteLine(value == lipsum); // True - it worked fine
    }
    private static byte[] Compress(string value)
    {
        using (var memoryStream = new MemoryStream())
        {
            using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Compress))
            {
                gZipStream.Write(Encoding.UTF8.GetBytes(value));
            }
            return memoryStream.ToArray();
        }
    }
    private static string Decompress(byte[] bytes)
    {
        using (var memoryStream = new MemoryStream(bytes))
        using (var gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
        using (var memoryStreamOutput = new MemoryStream())
        {
            gZipStream.CopyTo(memoryStreamOutput);
            var outputBytes = memoryStreamOutput.ToArray();

            string decompressed = Encoding.UTF8.GetString(outputBytes);
            return decompressed;
        }
    }

    // MASSIVELY TRUNCATED FOR POST!
    const string lipsum = @"Lorem ipsum dolor sit amet,  ... ac dolor ac hendrerit.";
}
person Marc Gravell    schedule 23.03.2020
comment
Спасибо за ваше решение, хотя я использовал другой пакет: ICSharp.SharpZipLib, и он отлично работал без ошибок, просто немного изменил код! В любом случае, спасибо :D - person Harry the Gamer - AzureX1212; 23.03.2020