3

文字列を圧縮するためのコードサンプルを見ていました。GZipStream クラスを使用するだけで十分であることがわかりました。しかし、例に示すように、ベース 64 文字列に変換する必要がある理由がわかりません。

using System.IO.Compression;
using System.Text;
using System.IO;

public static string Compress(string text)
{
    byte[] buffer = Encoding.UTF8.GetBytes(text);
    MemoryStream ms = new MemoryStream();

    using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
    {
        zip.Write(buffer, 0, buffer.Length);
    }

    ms.Position = 0;
    MemoryStream outStream = new MemoryStream();

    byte[] compressed = new byte[ms.Length];
    ms.Read(compressed, 0, compressed.Length);

    byte[] gzBuffer = new byte[compressed.Length + 4];
    System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
    System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
    return Convert.ToBase64String(gzBuffer);
}

さらに、 gzBuffer が size に初期化されていることを理解していませんcompressed.Length + 4。実際、最後のいくつかのステートメントがある理由もわかりません。誰かが光を共有できますか?

4

1 に答える 1

3

ほとんどの場合、base 64 文字列は、たとえば電子メールなどを含む印刷用にプレーンテキストとして表示できるようにするためのものです。編集: sourceが表示されるようになりました。彼らはそれを XML ファイルに挿入したいと言っているので、プレーン テキストにする必要がありました。

次の行 - BlockCopycompressed.Length + 4のため、サイズが必要です。4 バイトから gzBuffer へのコピーを開始します。(4 番目の引数は、宛先バッファーへのバイト オフセットです)。2 番目の BlockCopy は、圧縮された文字列の長さを宛先バッファーの最初の 4 バイトに入れています。ここで長さが必要な理由はわかりませんが、一致する必要がある対応するデコードルーチンがある可能性があります。

編集:長さは解凍ルーチンで使用されるため、プログラムは解凍されたバイトバッファーの長さを知ることができます。

于 2010-07-12T09:18:02.830 に答える