CompressionUtil.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using UnityEngine;
  2. using System;
  3. using System.IO;
  4. using System.Text;
  5. using ICSharpCode.SharpZipLib.GZip;
  6. using ICSharpCode.SharpZipLib.Zip;
  7. using ICSharpCode.SharpZipLib.BZip2;
  8. /// <summary>
  9.  /// 压缩方式。
  10.  /// </summary>
  11. public enum CompressionType
  12. {
  13. /// <summary>
  14.   /// GZip 压缩格式
  15.   /// </summary>
  16. GZip,
  17. /// <summary>
  18.   /// BZip2 压缩格式
  19.   /// </summary>
  20. BZip2,
  21. /// <summary>
  22.   /// Zip 压缩格式
  23.   /// </summary>
  24. Zip
  25. }
  26. public static class CompressionUtil
  27. {
  28. public static CompressionType CompressionProvider = CompressionType.GZip;
  29. public static byte[] Compress(byte[] bytesToCompress)
  30. {
  31. MemoryStream ms = new MemoryStream();
  32. Stream s = OutputStream(ms);
  33. s.Write(bytesToCompress, 0, bytesToCompress.Length);
  34. s.Close();
  35. return ms.ToArray();
  36. }
  37. public static string Compress(string stringToCompress)
  38. {
  39. byte[] compressedData = CompressToByte(stringToCompress);
  40. string strOut = Convert.ToBase64String(compressedData);
  41. return strOut;
  42. }
  43. public static byte[] CompressToByte(string stringToCompress)
  44. {
  45. byte[] bytData = Encoding.Unicode.GetBytes(stringToCompress);
  46. return Compress(bytData);
  47. }
  48. public static string UnCompress(string stringToDecompress)
  49. {
  50. string outString = string.Empty;
  51. if (stringToDecompress == null)
  52. {
  53. throw new ArgumentNullException("stringToDecompress", "You tried to use an empty string");
  54. }
  55. try
  56. {
  57. byte[] inArr = Convert.FromBase64String(stringToDecompress.Trim());
  58. outString = Encoding.Unicode.GetString(UnCompress(inArr));
  59. }
  60. catch (NullReferenceException nEx)
  61. {
  62. return nEx.Message;
  63. }
  64. return outString;
  65. }
  66. public static byte[] UnCompress(byte[] bytesToDecompress)
  67. {
  68. byte[] writeData = new byte[4096];
  69. Stream s2 = InputStream(new MemoryStream(bytesToDecompress));
  70. MemoryStream outStream = new MemoryStream();
  71. while (true)
  72. {
  73. int size = s2.Read(writeData, 0, writeData.Length);
  74. if (size > 0)
  75. {
  76. outStream.Write(writeData, 0, size);
  77. }
  78. else
  79. {
  80. break;
  81. }
  82. }
  83. s2.Close();
  84. byte[] outArr = outStream.ToArray();
  85. outStream.Close();
  86. return outArr;
  87. }
  88. private static Stream OutputStream(Stream inputStream)
  89. {
  90. switch (CompressionProvider)
  91. {
  92. case CompressionType.BZip2:
  93. return new BZip2OutputStream(inputStream);
  94. case CompressionType.GZip:
  95. return new GZipOutputStream(inputStream);
  96. case CompressionType.Zip:
  97. return new ZipOutputStream(inputStream);
  98. default:
  99. return new GZipOutputStream(inputStream);
  100. }
  101. }
  102. private static Stream InputStream(Stream inputStream)
  103. {
  104. switch (CompressionProvider)
  105. {
  106. case CompressionType.BZip2:
  107. return new BZip2InputStream(inputStream);
  108. case CompressionType.GZip:
  109. return new GZipInputStream(inputStream);
  110. case CompressionType.Zip:
  111. return new ZipInputStream(inputStream);
  112. default:
  113. return new GZipInputStream(inputStream);
  114. }
  115. }
  116. }