【问题标题】:Compressing and decompressing a string yields only the first letter of the original string?压缩和解压缩字符串只产生原始字符串的第一个字母?
【发布时间】:2012-06-25 18:58:50
【问题描述】:

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

【问题讨论】:

    标签: c# gzipstream


    【解决方案1】:

    这些是问题所在:

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

    您将每个字节解释为自己的字符,而实际上并非如此。相反,您需要以下行:

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

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

    基本问题是您正在转换为基于编码的字节数组,但在检索字节时忽略了该编码。同样,您可能希望使用Encoding.UTF8 而不是Encoding.Unicode(尽管这无关紧要,只要编码匹配即可。)

    【讨论】:

    • 修复了它。为了安全起见,我也在这两种方法中将Encoding.Unicode 更改为Encoding.UTF8。谢谢!延迟到期后我会接受。
    【解决方案2】:

    在您的压缩方法中,将 Unicode 替换为 UTF8:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      相关资源
      最近更新 更多