2012-06-25 30 views
0

我压缩使用此代码Gzip已字符串:压缩和解压缩字符串只会产生原始字符串的第一个字母?

public static String Compress(String decompressed) 
    { 
     byte[] data = Encoding.Unicode.GetBytes(decompressed); 
     using (var input = new MemoryStream(data)) 
     using (var output = new MemoryStream()) 
     { 
      using (var gzip = new GZipStream(output, CompressionMode.Compress, true)) 
      { 
       input.CopyTo(gzip); 
      } 
      return Convert.ToBase64String(output.ToArray()); 
     } 
    } 

,并使用此代码解压缩它:

public static String Decompress(String compressed) 
    { 
     byte[] data = Convert.FromBase64String(compressed); 
     using (MemoryStream input = new MemoryStream(data)) 
     using (GZipStream gzip = new GZipStream(input, CompressionMode.Decompress)) 
     using (MemoryStream output = new MemoryStream()) 
     { 
      gzip.CopyTo(output); 
      StringBuilder sb = new StringBuilder(); 
      foreach (byte b in output.ToArray()) 
       sb.Append((char)b); 
      return sb.ToString(); 
     } 
    } 

当我在此示例代码中使用这些功能,结果是只信S

String test = "SELECT * FROM foods f WHERE f.name = 'chicken';"; 
String com = Compress(test); 
String decom = Decompress(com); 
Console.WriteLine(decom); 

如果我调试的代码,我看到的decom值是

S\0E\0L\0E\0C\0T\0 \0*\0 \0F\0R\0O\0M\0 \0f\0o\0o\0d\0s\0 \0f\0 \0W\0H\0E\0R\0E\0 \0f\0.\0n\0a\0m\0e\0 \0=\0 \0'\0c\0h\0i\0c\0k\0e\0n\0'\0;\0 

但显示的值只是字母S

回答

3

这些线的问题:

foreach (byte b in output.ToArray()) 
    sb.Append((char)b); 

您解释每一个字节作为自己的特点,但实际上这不是案件。相反,你需要这行:

string decoded = Encoding.Unicode.GetString(output.ToArray()); 

它将根据编码将字节数组转换为字符串。

最基本的问题是,您将基于编码转换为字节数组,但在检索字节时忽略该编码。此外,您可能想使用Encoding.UTF8而不是Encoding.Unicode(尽管这应该不重要,只要编码匹配即可)。

+0

修正了这个问题。为了安全起见,我在两种方法中都将'Encoding.Unicode'更改为'Encoding.UTF8'。谢谢!一旦延迟到期,我会接受。 –

1

在您的压缩方法与UTF8替换的Unicode:

byte[] data = Encoding.UTF8.GetBytes(decompressed);