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です。

4

2 に答える 2

3

これらの行が問題です:

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

実際にはそうではない場合、各バイトを独自の文字として解釈しています。代わりに、次の行が必要です。

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

エンコーディングに基づいて、バイト配列を文字列に変換します。

基本的な問題は、エンコーディングに基づいてバイト配列に変換しているが、バイトを取得するときにそのエンコーディングを無視することです。同様に、Encoding.UTF8代わりに ofを使用することもできますEncoding.Unicode(ただし、エンコーディングが一致する限り、それは問題ではありません)。

于 2012-06-25T19:04:47.320 に答える
1

圧縮メソッドで、Unicode を UTF8 に置き換えます。

byte[] data = Encoding.UTF8.GetBytes(decompressed);
于 2012-06-25T19:04:11.387 に答える