一般的使用流程(4步):
服务器端将字符串Gzip压缩为 字节数组——>通过base64转为字符串(后传递到客户端)——>解码base64字符串为字节数组——>Gzip解码字节数组为可用字符串。
第一步:服务器端压缩(本人使用的是C#)
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Json; using System.Text; using System.Web; using ICSharpCode.SharpZipLib.BZip2; using ICSharpCode.SharpZipLib.GZip; using ICSharpCode.SharpZipLib.Zip; namespace amtioth5.Helper { public enum CompressionType { /// <summary> /// GZip 压缩格式 /// </summary> GZip, /// <summary> /// BZip2 压缩格式 /// </summary> BZip2, /// <summary> /// Zip 压缩格式 /// </summary> Zip } public class CompressHelper { public static CompressionType CompressionProvider = CompressionType.GZip; #region Public methods /// <summary> /// 从原始字节数组生成已压缩的字节数组。 /// </summary> /// <param name="bytesToCompress">原始字节数组。</param> /// <returns>返回已压缩的字节数组</returns> public static byte[] Compress(byte[] bytesToCompress) { MemoryStream ms = new MemoryStream(); Stream s = OutputStream(ms); s.Write(bytesToCompress, 0, bytesToCompress.Length); s.Close(); return ms.ToArray(); } /// <summary> /// 从原始字符串生成已压缩的字符串。 /// </summary> /// <param name="stringToCompress">原始字符串。</param> /// <returns>返回已压缩的字符串。</returns> public static string Compress(string stringToCompress) { byte[] compressedData = CompressToByte(stringToCompress); string strOut = Convert.ToBase64String(compressedData); return strOut; } /// <summary> /// 从原始字符串生成已压缩的字节数组。 /// </summary> /// <param name="stringToCompress">原始字符串。</param> /// <returns>返回已压缩的字节数组。</returns> public static byte[] CompressToByte(string stringToCompress) { byte[] bytData = Encoding.UTF8.GetBytes(stringToCompress); return Compress(bytData); } /// <summary> /// 从已压缩的字符串生成原始字符串。 /// </summary> /// <param name="stringToDecompress">已压缩的字符串。</param> /// <returns>返回原始字符串。</returns> public static string DeCompress(string stringToDecompress) { string outString = string.Empty; if (stringToDecompress == null) { throw new ArgumentNullException("stringToDecompress", "You tried to use an empty string"); } try { byte[] inArr = Convert.FromBase64String(stringToDecompress.Trim()); byte[] deArr = DeCompress(inArr); outString = Encoding.UTF8.GetString(deArr, 0, deArr.Length); } catch (NullReferenceException nEx) { return nEx.Message; } return outString; } /// <summary> /// 从已压缩的字节数组生成原始字节数组。 /// </summary> /// <param name="bytesToDecompress">已压缩的字节数组。</param> /// <returns>返回原始字节数组。</returns> public static byte[] DeCompress(byte[] bytesToDecompress) { byte[] writeData = new byte[4096]; Stream s2 = InputStream(new MemoryStream(bytesToDecompress)); MemoryStream outStream = new MemoryStream(); while (true) { int size = s2.Read(writeData, 0, writeData.Length); if (size > 0) { outStream.Write(writeData, 0, size); } else { break; } } s2.Close(); byte[] outArr = outStream.ToArray(); outStream.Close(); return outArr; } #endregion #region Private methods /// <summary> /// 从给定的流生成压缩输出流。 /// </summary> /// <param name="inputStream">原始流。</param> /// <returns>返回压缩输出流。</returns> private static Stream OutputStream(Stream inputStream) { switch (CompressionProvider) { case CompressionType.BZip2: return new BZip2OutputStream(inputStream); case CompressionType.GZip: return new GZipOutputStream(inputStream); case CompressionType.Zip: return new ZipOutputStream(inputStream); default: return new GZipOutputStream(inputStream); } } /// <summary> /// 从给定的流生成压缩输入流。 /// </summary> /// <param name="inputStream">原始流。</param> /// <returns>返回压缩输入流。</returns> private static Stream InputStream(Stream inputStream) { switch (CompressionProvider) { case CompressionType.BZip2: return new BZip2InputStream(inputStream); case CompressionType.GZip: return new GZipInputStream(inputStream); case CompressionType.Zip: return new ZipInputStream(inputStream); default: return new GZipInputStream(inputStream); } } #endregion public static T FromJsonTo<T>(string jsonString) { DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(T)); MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)); T jsonObject = (T)ser.ReadObject(ms); ms.Close(); return jsonObject; } public static string ToJsonString(object item) { DataContractJsonSerializer serializer = new DataContractJsonSerializer(item.GetType()); using (MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, item); StringBuilder sb = new StringBuilder(); byte[] bytes = ms.ToArray(); sb.Append(Encoding.UTF8.GetString(bytes, 0, bytes.Length)); return sb.ToString(); } } } }