我正在使用此代码使用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
。
答案 0 :(得分:3)
这些问题是:
foreach (byte b in output.ToArray())
sb.Append((char)b);
您将每个字节解释为自己的字符,而事实并非如此。相反,你需要这一行:
string decoded = Encoding.Unicode.GetString(output.ToArray());
将根据编码将字节数组转换为字符串。
基本问题是您正在转换为基于编码的字节数组,但在检索字节时忽略该编码。同样,您可能希望使用Encoding.UTF8
代替Encoding.Unicode
(尽管这不重要,只要编码匹配。)
答案 1 :(得分:1)
在您的compress方法中,用UTF8替换Unicode:
byte[] data = Encoding.UTF8.GetBytes(decompressed);