【问题标题】:zip and unzip string with Deflate使用 Deflate 压缩和解压缩字符串
【发布时间】:2010-01-22 16:55:37
【问题描述】:

我需要压缩和解压缩字符串

代码如下:

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 方法似乎有错误。有人可以帮助我吗?

【问题讨论】:

  • 您遇到编译器错误、异常还是什么?您能否提供有关“错误”的更多详细信息?

标签: c# .net deflatestream


【解决方案1】:

有两个不同的问题。首先,在ZipStr 中,您需要在读取MemoryStream 之前刷新或关闭StreamWriter 并关闭DeflateStream

其次,在UnZipStr 中,您正在从inputStream 中的压缩字节构造结果字符串。您应该返回 reader.ReadToEnd() 的结果。

StreamWriterStreamReader 构造函数中指定字符串编码也是一个好主意。

试试下面的代码:

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();
            }
        }
    }
}

【讨论】:

  • @Mikhail ZipStr 也有问题。我已经更新了我的答案。
  • @PhilRoss 非常感谢,但我有一个问题。这个多线程怎么做?使用 TPL?
猜你喜欢
  • 2016-01-06
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多