2012-06-25 85 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);