GZipStream:为什么我们在压缩后转换为base 64?

时间:2010-07-12 09:10:44

标签: .net compression base64 gzipstream

我只是在查看压缩字符串的代码示例。我发现使用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大小。其实我不明白为什么我们也有最后几个陈述。有人可以分享一些亮点......

PS:我不是计算机科学专业的学生。

1 个答案:

答案 0 :(得分:3)

最有可能的是基本64字符串,因此它可以被视为纯文本,例如用于打印,包括在电子邮件中或类似的东西。 编辑现在我看到了source,他们说他们想将其插入XML文件中,这就是为什么他们需要纯文本。

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

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