CompressHelper.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO.Compression;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace trieTree.xiaoshi.sz.com
  8. {
  9. public class MemoryStreamStack
  10. {
  11. private Stack<MemoryStream>? _streams = null;
  12. public MemoryStreamStack() : this(100)
  13. {
  14. }
  15. public MemoryStreamStack(int capacity)
  16. {
  17. _streams = new Stack<MemoryStream>(capacity);
  18. }
  19. public MemoryStream GetMemoryStream()
  20. {
  21. MemoryStream? stream = null;
  22. if (_streams.Count > 0)
  23. {
  24. lock (_streams)
  25. {
  26. if (_streams.Count > 0)
  27. {
  28. stream = (MemoryStream)_streams.Pop();
  29. }
  30. }
  31. }
  32. if (stream == null)
  33. {
  34. stream = new MemoryStream(0x800);
  35. }
  36. return stream;
  37. }
  38. public void ReleaseMemoryStream(MemoryStream stream)
  39. {
  40. if (stream == null)
  41. {
  42. return;
  43. }
  44. stream.Position = 0L;
  45. stream.SetLength(0L);
  46. lock (_streams)
  47. {
  48. _streams.Push(stream);
  49. }
  50. }
  51. ~MemoryStreamStack()
  52. {
  53. foreach (MemoryStream memory in _streams)
  54. {
  55. memory.Dispose();
  56. }
  57. _streams.Clear();
  58. _streams = null;
  59. }
  60. }
  61. public static class CompressHelper
  62. {
  63. private readonly static MemoryStreamStack MemoryStreamStacker = new MemoryStreamStack();
  64. public static string CompressBytesToBase64String(byte[] buffer)
  65. {
  66. if (buffer == null || buffer.Length == 0)
  67. {
  68. return "";
  69. }
  70. byte[] compressedData = CompressBytes(buffer);
  71. return System.Convert.ToBase64String(compressedData, 0, compressedData.Length);
  72. }
  73. public static string ConvertBytesToBase64String(byte[] buffer)
  74. {
  75. if (buffer == null || buffer.Length == 0)
  76. {
  77. return "";
  78. }
  79. return System.Convert.ToBase64String(buffer, 0, buffer.Length);
  80. }
  81. public static byte[] ConvertBase64StringToBytes(string deCompressString)
  82. {
  83. if (string.IsNullOrEmpty(deCompressString))
  84. {
  85. return new byte[0];
  86. }
  87. byte[] buffer = System.Convert.FromBase64String(deCompressString);
  88. return buffer;
  89. }
  90. public static byte[] DeCompressBase64StringToBytes(string deCompressString)
  91. {
  92. if (string.IsNullOrEmpty(deCompressString))
  93. {
  94. return new byte[0];
  95. }
  96. byte[] buffer = System.Convert.FromBase64String(deCompressString);
  97. byte[] ret = DeCompressBytes(buffer);
  98. return ret;
  99. }
  100. public static byte[] CompressBytes(byte[] buffer)
  101. {
  102. if (buffer == null || buffer.Length == 0)
  103. {
  104. return buffer;
  105. }
  106. byte[] compressedData;
  107. MemoryStream ms = MemoryStreamStacker.GetMemoryStream();
  108. try
  109. {
  110. using (DeflateStream compressedzipStream = new DeflateStream(ms, CompressionMode.Compress, true))
  111. {
  112. compressedzipStream.Write(buffer, 0, buffer.Length);
  113. }
  114. ms.SetLength(ms.Position);
  115. //如果得到的结果长度比原来还大,则不需要压宿,返回原来的,并带上一位标识数据是否已压宿过
  116. if (ms.Length >= buffer.Length)
  117. {
  118. compressedData = new byte[buffer.Length + 1];
  119. buffer.CopyTo(compressedData, 0);
  120. compressedData[compressedData.Length - 1] = 0;
  121. }
  122. else
  123. {
  124. compressedData = new byte[ms.Length + 1];
  125. ms.ToArray().CopyTo(compressedData, 0);
  126. compressedData[compressedData.Length - 1] = 1;
  127. }
  128. //ms.Close();
  129. }
  130. finally
  131. {
  132. MemoryStreamStacker.ReleaseMemoryStream(ms);
  133. }
  134. return compressedData;
  135. }
  136. private static MemoryStream DeCompressMemoryToMemory(MemoryStream ms)
  137. {
  138. MemoryStream data = MemoryStreamStacker.GetMemoryStream();
  139. using (DeflateStream zipStream = new DeflateStream(ms, CompressionMode.Decompress))
  140. {
  141. byte[] writeData = new byte[8192];
  142. // Use the ReadAllBytesFromStream to read the stream.
  143. while (true)
  144. {
  145. int size = zipStream.Read(writeData, 0, writeData.Length);
  146. if (size > 0)
  147. {
  148. data.Write(writeData, 0, size);
  149. }
  150. else
  151. {
  152. break;
  153. }
  154. }
  155. }
  156. return data;
  157. }
  158. public static byte[] DeCompressBytes(byte[] buffer)
  159. {
  160. if (buffer == null || buffer.Length <= 0)
  161. {
  162. return buffer;
  163. }
  164. byte[] bytes = new byte[buffer.Length - 1];
  165. Array.Copy(buffer, bytes, bytes.Length);
  166. //如果最后一位是0,说明没有被压宿,那么也不需要解压速
  167. if (buffer[buffer.Length - 1] == 0)
  168. {
  169. return bytes;
  170. }
  171. using (MemoryStream ms = new MemoryStream(buffer))
  172. {
  173. MemoryStream stream = null;
  174. try
  175. {
  176. stream = DeCompressMemoryToMemory(ms);
  177. stream.SetLength(stream.Position);
  178. bytes = stream.ToArray();
  179. }
  180. finally
  181. {
  182. MemoryStreamStacker.ReleaseMemoryStream(stream);
  183. }
  184. }
  185. return bytes;
  186. }
  187. }
  188. }