压缩和解压缩字符串只会产生原始字符串的第一个字母?

时间:2012-06-25 18:58:51

标签: c# gzipstream

我正在使用此代码使用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

2 个答案:

答案 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);