2010-01-22 214 views
11

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

这里是代码:

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

+4

你得到一个编译器错误,或异常,还是什么?你能提供关于“错误”的更多细节吗? – Nick 2010-01-22 16:59:13

回答

24

有两个单独的问题。首先,在ZipStr中,您需要刷新或关闭StreamWriter并关闭DeflateStream,然后再从MemoryStream读取。

其次,在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(); 
      } 
     } 
    } 
} 
+0

@Mikhail“ZipStr”也有问题。我已经更新了我的答案。 – 2010-01-22 17:19:49

+0

@PhilRoss非常感谢,但我有一个问题。 如何做到这一点多线程?使用TPL? – IamStalker 2014-04-01 05:18:57