【问题标题】:GZipStream: why do we convert to base 64 after compression?GZipStream:为什么我们压缩后转换为base 64?
【发布时间】:2010-07-12 09:10:43
【问题描述】:

我只是在查看用于压缩字符串的代码示例。我发现使用 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 被初始化为大小compressed.Length + 4。其实我也不明白为什么我们有最后几句话。有人可以分享一下吗?

【问题讨论】:

    标签: .net compression base64 gzipstream


    【解决方案1】:

    base 64 字符串最有可能被视为纯文本,例如用于打印,包括在电子邮件或类似内容中。 编辑:现在我看到source,他们说他们想将它插入到一个XML文件中,所以这就是他们需要纯文本的原因。

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

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

    【讨论】:

    • 所以转换不会影响输出的大小?和 abt tht 解码例程 - 是的,有一个! os 将长度存储在 4 个字节中的目的是什么?有必要吗?附:代码取自here
    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    相关资源
    最近更新 更多