using System; using System.Text; using System.IO.Compression; using System.IO; /// <summary> /// GZip算法比较适合压缩大量文本数据 /// 不适合压缩图片(压缩后反而会变大) /// </summary> public static class GZipUtil { public static string Compress(string input) { if (string.IsNullOrEmpty(input)) return input; byte[] buffer = Encoding.UTF8.GetBytes(input); byte[] compressBuffer = Compress(buffer); string base64 = Convert.ToBase64String(compressBuffer); return base64; } public static string Decompress(string base64) { if (string.IsNullOrEmpty(base64)) return base64; byte[] buffer = Convert.FromBase64String(base64); byte[] decompressBuffer = Decompress(buffer); string output = Encoding.UTF8.GetString(decompressBuffer); return output; } public static byte[] Compress(byte[] buffer) { if (buffer == null || buffer.Length == 0) return buffer; //将数据压缩到内存流中 MemoryStream ms = new MemoryStream(); GZipStream gzip = new GZipStream(ms, CompressionMode.Compress, true); gzip.Write(buffer, 0, buffer.Length); gzip.Flush(); gzip.Close(); gzip.Dispose(); //从内存流中读出压缩数据 byte[] compressBuffer = ms.ToArray(); ms.Close(); ms.Dispose(); return compressBuffer; } public static byte[] Decompress(byte[] buffer) { if (buffer == null || buffer.Length == 0) return buffer; //将数据解压到内存流中 MemoryStream ms = new MemoryStream(buffer); GZipStream gzip = new GZipStream(ms, CompressionMode.Decompress, true); //从gzip流中读出解压数据 buffer = new byte[buffer.Length]; MemoryStream decompressStream = new MemoryStream(); int count; while ((count = gzip.Read(buffer, 0, buffer.Length)) > 0) decompressStream.Write(buffer, 0, count); gzip.Close(); byte[] decompressBuffer = decompressStream.ToArray(); ms.Dispose(); return decompressBuffer; } public static bool IsGZip(byte[] buffer) { //gzip头信息格式 //ID1(1byte)+ID2(1byte)+压缩方法(1byte)+标志(1byte)+MTIME(4byte)+额外头字段(可选) //ID1和ID2为固定值ID1=31、ID2=139 bool isgzip = true; byte[] head = new byte[] { 31, 139 }; for (int i=0; i< head.Length; i++) { if (buffer[i] != head[i]) { isgzip = false; break; } } return isgzip; } }