字符壓縮,壓縮的整體說:https://blog.csdn.net/lanmenghcc/article/details/40071923
總計:
1.7z壓縮率最高,沒測試,但只能文件壓縮不能字符串壓縮。
2.GZip和zlib可以進行字符串流壓縮,對比GZip一般為文件壓縮,壓縮數據還是用的zlib。zlib為純數據的壓縮,壓縮完比gzip少16個字節的頭部文件標識。
3.gzip微軟系統包有集成、zlib需要另外引入包。
4.壓縮測試對於字符串比較小,大概256字符串左右,壓縮字符串比壓縮前還大。畢竟壓縮還是要標記些東西
對比下來還是用gzip壓縮。
下面貼代碼GZip壓縮和解壓:
壓縮
/// <summary> /// GZip壓縮 256字節以上才有壓縮效果 /// </summary> /// <param name="strData">壓縮字符串</param> /// <returns></returns> public static string Compress(string strData) { try { byte[] data = Encoding.GetEncoding("UTF-8").GetBytes(strData); using (var ms = new MemoryStream()) { using (var zip = new GZipStream(ms, CompressionMode.Compress, true)) { zip.Write(data, 0, data.Length); } var buffer = new byte[ms.Length]; ms.Position = 0; ms.Read(buffer, 0, buffer.Length); return Convert.ToBase64String(buffer); } } catch (Exception ex) { return null; } }
解壓:
try { byte[] data = Convert.FromBase64String(strData); using (var ms = new MemoryStream(data)) { using (var zip = new GZipStream(ms, CompressionMode.Decompress, true)) { using (var msreader = new MemoryStream()) { var buffer = new byte[0x1000];//4M存儲大小 while (true) { var reader = zip.Read(buffer, 0, buffer.Length); if (reader <= 0) { break; } msreader.Write(buffer, 0, reader); } msreader.Position = 0; buffer = msreader.ToArray(); return Encoding.GetEncoding("UTF-8").GetString(buffer); } } } } catch (Exception ex) { return null; }
zlib壓縮和解壓:
壓縮:
public static string Zip(string value) { byte[] byteArray = Encoding.UTF8.GetBytes(value); byte[] tmpArray; using (MemoryStream ms = new MemoryStream()) { using (zlib.ZOutputStream outZStream = new zlib.ZOutputStream(ms, zlib.zlibConst.Z_DEFAULT_COMPRESSION)) { outZStream.Write(byteArray, 0, byteArray.Length); outZStream.Flush(); } tmpArray = ms.ToArray(); } return Convert.ToBase64String(tmpArray); }
解壓:有點長沒縮減
/// <summary> /// 解壓縮字節數組 /// </summary> /// <param name="sourceByte">需要被解壓縮的字節數組</param> /// <returns>解壓后的字節數組</returns> private static byte[] deCompressBytes(byte[] sourceByte) { MemoryStream inputStream = new MemoryStream(sourceByte); Stream outputStream = deCompressStream(inputStream); byte[] outputBytes = new byte[outputStream.Length]; outputStream.Position = 0; outputStream.Read(outputBytes, 0, outputBytes.Length); outputStream.Close(); inputStream.Close(); return outputBytes; } /// <summary> /// 解壓縮流 /// </summary> /// <param name="sourceStream">需要被解壓縮的流</param> /// <returns>解壓后的流</returns> private static Stream deCompressStream(Stream sourceStream) { MemoryStream outStream = new MemoryStream(); ZOutputStream outZStream = new ZOutputStream(outStream); CopyStream(sourceStream, outZStream); outZStream.finish(); return outStream; } /// <summary> /// 復制流 /// </summary> /// <param name="input">原始流</param> /// <param name="output">目標流</param> public static void CopyStream(System.IO.Stream input, System.IO.Stream output) { byte[] buffer = new byte[2000]; int len; while ((len = input.Read(buffer, 0, 2000)) > 0) { output.Write(buffer, 0, len); } output.Flush(); }