заархивировать и разархивировать строку с помощью Deflate

Мне нужно заархивировать и разархивировать строку

Вот код:

public static byte[] ZipStr(String str)
{
    using (MemoryStream output = new MemoryStream())
    using (DeflateStream gzip = new DeflateStream(output, CompressionMode.Compress))
    using (StreamWriter writer = new StreamWriter(gzip))
       {
                writer.Write(str);
                return output.ToArray();
       }
}

и

public static string UnZipStr(byte[] input)
{
    using (MemoryStream inputStream = new MemoryStream(input))
    using (DeflateStream gzip = new DeflateStream(inputStream, CompressionMode.Decompress))
    using (StreamReader reader = new StreamReader(gzip))
       {
        reader.ReadToEnd();
        return System.Text.Encoding.UTF8.GetString(inputStream.ToArray());
       }
}

Кажется, в методе UnZipStr ошибка. Кто-нибудь может мне помочь?


person Mikhail    schedule 22.01.2010    source источник
comment
Вы получаете ошибку компилятора, исключение или что? Можете ли вы предоставить более подробную информацию об ошибке, пожалуйста?   -  person Nick    schedule 22.01.2010


Ответы (1)


Есть две отдельные проблемы. Прежде всего, в ZipStr вам нужно очистить или закрыть StreamWriter и закрыть DeflateStream перед чтением из MemoryStream.

Во-вторых, в UnZipStr вы строите результирующую строку из сжатых байтов в inputStream. Вместо этого вы должны вернуть результат reader.ReadToEnd().

Также было бы неплохо указать кодировку строки в конструкторах StreamWriter и StreamReader.

Вместо этого попробуйте следующий код:

public static byte[] ZipStr(String str)
{
    using (MemoryStream output = new MemoryStream())
    {
        using (DeflateStream gzip = 
          new DeflateStream(output, CompressionMode.Compress))
        {
            using (StreamWriter writer = 
              new StreamWriter(gzip, System.Text.Encoding.UTF8))
            {
                writer.Write(str);           
            }
        }

        return output.ToArray();
    }
}

public static string UnZipStr(byte[] input)
{
    using (MemoryStream inputStream = new MemoryStream(input))
    {
        using (DeflateStream gzip = 
          new DeflateStream(inputStream, CompressionMode.Decompress))
        {
            using (StreamReader reader = 
              new StreamReader(gzip, System.Text.Encoding.UTF8))
            {
                return reader.ReadToEnd();
            }
        }
    }
}
person Phil Ross    schedule 22.01.2010
comment
@Mikhail С ZipStr тоже была проблема. Я обновил свой ответ. - person Phil Ross; 22.01.2010
comment
@PhilRoss Большое спасибо, но у меня есть вопрос. Как сделать это многопоточным? Использование TPL? - person IamStalker; 01.04.2014