我只是在查看用于压缩字符串的代码示例。我发现使用 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
。其实我也不明白为什么我们有最后几句话。有人可以分享一些光吗?
最有可能的是,基于 64 的字符串可以被视为纯文本,例如用于打印,包括在电子邮件或类似内容中。Edit:现在我看到了source http://www.csharphelp.com/2007/09/compress-and-decompress-strings-in-c/,他们说他们想将其插入到 XML 文件中,所以这就是为什么他们需要是纯文本。
The compressed.Length + 4
由于下一行,需要尺寸 -块复制 http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx。它开始将 4 个字节复制到 gzBuffer 中。 (第四个参数是目标缓冲区的字节偏移量)。第二个 BlockCopy 将压缩字符串的长度放入目标缓冲区的前四个字节中。我不确定为什么它需要这里的长度,但很可能有一个与之对应的相应解码例程。
Edit:该长度用于解压缩例程,以便程序知道解压缩的字节缓冲区应该有多长。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)