3

我只是在查看用于压缩字符串的代码示例。我发现使用 GZipStream 类就足够了。但我不明白为什么我们必须将其转换为 base 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 字符串可以被视为纯文本,例如用于打印,包括在电子邮件或类似的东西中。编辑:现在我看到了,他们说他们想将它插入到 XML 文件中,所以这就是为什么他们需要纯文本。

由于compressed.Length + 4下一行 - BlockCopy ,因此需要大小。它开始从 4 个字节复制到 gzBuffer。(第 4 个参数是目标缓冲区的字节偏移量)。第二个 BlockCopy 将压缩字符串的长度放入目标缓冲区的前四个字节。我不确定为什么它需要这里的长度,但很可能有一个相应的解码例程必须与之对齐。

编辑:在解压缩例程中使用长度,以便程序知道解压缩的字节缓冲区应该多长。

于 2010-07-12T09:18:02.830 回答