压缩/解压缩字符串的代码
public static void CopyTo(Stream src, Stream dest) { byte[] bytes = new byte[4096]; int cnt; while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0) { dest.Write(bytes, 0, cnt); }}public static byte[] Zip(string str) { var bytes = Encoding.UTF8.GetBytes(str); using (var msi = new MemoryStream(bytes)) using (var mso = new MemoryStream()) { using (var gs = new GZipStream(mso, CompressionMode.Compress)) { //msi.CopyTo(gs); CopyTo(msi, gs); } return mso.ToArray(); }}public static string Unzip(byte[] bytes) { using (var msi = new MemoryStream(bytes)) using (var mso = new MemoryStream()) { using (var gs = new GZipStream(msi, CompressionMode.Decompress)) { //gs.CopyTo(mso); CopyTo(gs, mso); } return Encoding.UTF8.GetString(mso.ToArray()); }}static void Main(string[] args) { byte[] r1 = Zip("StringStringStringStringStringStringStringStringStringStringStringStringStringString"); string r2 = Unzip(r1);}请记住,
Zip返回
byte[],而
Unzip返回
string。如果您想要一个字符串,
Zip可以对它进行base64编码(例如,使用
Convert.Tobase64String(r1))(结果
Zip是非常二进制的!则不能将其打印到屏幕上或直接以XML编写)
建议的版本适用于.NET 2.0,适用于.NET 4.0使用
MemoryStream.CopyTo。
重要说明:
在
GZipStream知道压缩内容具有所有输入之前(即,有效压缩它需要所有数据),才能将压缩内容写入输出流。在检查输出流(例如)之前,需要确保您
Dispose()的身份。这是通过上面的块完成的。请注意,是最里面的块,并且可以在其外部访问内容。这同样适用于解压缩:在中尝试访问之前的数据。
GZipStream``mso.ToArray()``using(){ }``GZipStream``Dispose()``GZipStream


