123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- using System;
- using System.Collections.Generic;
- using System.IO.Compression;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace trieTree.xiaoshi.sz.com
- {
- public class MemoryStreamStack
- {
- private Stack<MemoryStream>? _streams = null;
- public MemoryStreamStack() : this(100)
- {
- }
- public MemoryStreamStack(int capacity)
- {
- _streams = new Stack<MemoryStream>(capacity);
- }
- public MemoryStream GetMemoryStream()
- {
- MemoryStream? stream = null;
- if (_streams.Count > 0)
- {
- lock (_streams)
- {
- if (_streams.Count > 0)
- {
- stream = (MemoryStream)_streams.Pop();
- }
- }
- }
- if (stream == null)
- {
- stream = new MemoryStream(0x800);
- }
- return stream;
- }
- public void ReleaseMemoryStream(MemoryStream stream)
- {
- if (stream == null)
- {
- return;
- }
- stream.Position = 0L;
- stream.SetLength(0L);
- lock (_streams)
- {
- _streams.Push(stream);
- }
- }
- ~MemoryStreamStack()
- {
- foreach (MemoryStream memory in _streams)
- {
- memory.Dispose();
- }
- _streams.Clear();
- _streams = null;
- }
- }
- public static class CompressHelper
- {
- private readonly static MemoryStreamStack MemoryStreamStacker = new MemoryStreamStack();
- public static string CompressBytesToBase64String(byte[] buffer)
- {
- if (buffer == null || buffer.Length == 0)
- {
- return "";
- }
- byte[] compressedData = CompressBytes(buffer);
- return System.Convert.ToBase64String(compressedData, 0, compressedData.Length);
- }
- public static string ConvertBytesToBase64String(byte[] buffer)
- {
- if (buffer == null || buffer.Length == 0)
- {
- return "";
- }
- return System.Convert.ToBase64String(buffer, 0, buffer.Length);
- }
- public static byte[] ConvertBase64StringToBytes(string deCompressString)
- {
- if (string.IsNullOrEmpty(deCompressString))
- {
- return new byte[0];
- }
- byte[] buffer = System.Convert.FromBase64String(deCompressString);
- return buffer;
- }
- public static byte[] DeCompressBase64StringToBytes(string deCompressString)
- {
- if (string.IsNullOrEmpty(deCompressString))
- {
- return new byte[0];
- }
- byte[] buffer = System.Convert.FromBase64String(deCompressString);
- byte[] ret = DeCompressBytes(buffer);
- return ret;
- }
- public static byte[] CompressBytes(byte[] buffer)
- {
- if (buffer == null || buffer.Length == 0)
- {
- return buffer;
- }
- byte[] compressedData;
- MemoryStream ms = MemoryStreamStacker.GetMemoryStream();
- try
- {
- using (DeflateStream compressedzipStream = new DeflateStream(ms, CompressionMode.Compress, true))
- {
- compressedzipStream.Write(buffer, 0, buffer.Length);
- }
- ms.SetLength(ms.Position);
- //如果得到的结果长度比原来还大,则不需要压宿,返回原来的,并带上一位标识数据是否已压宿过
- if (ms.Length >= buffer.Length)
- {
- compressedData = new byte[buffer.Length + 1];
- buffer.CopyTo(compressedData, 0);
- compressedData[compressedData.Length - 1] = 0;
- }
- else
- {
- compressedData = new byte[ms.Length + 1];
- ms.ToArray().CopyTo(compressedData, 0);
- compressedData[compressedData.Length - 1] = 1;
- }
- //ms.Close();
- }
- finally
- {
- MemoryStreamStacker.ReleaseMemoryStream(ms);
- }
- return compressedData;
- }
- private static MemoryStream DeCompressMemoryToMemory(MemoryStream ms)
- {
- MemoryStream data = MemoryStreamStacker.GetMemoryStream();
- using (DeflateStream zipStream = new DeflateStream(ms, CompressionMode.Decompress))
- {
- byte[] writeData = new byte[8192];
- // Use the ReadAllBytesFromStream to read the stream.
- while (true)
- {
- int size = zipStream.Read(writeData, 0, writeData.Length);
- if (size > 0)
- {
- data.Write(writeData, 0, size);
- }
- else
- {
- break;
- }
- }
- }
- return data;
- }
- public static byte[] DeCompressBytes(byte[] buffer)
- {
- if (buffer == null || buffer.Length <= 0)
- {
- return buffer;
- }
- byte[] bytes = new byte[buffer.Length - 1];
- Array.Copy(buffer, bytes, bytes.Length);
- //如果最后一位是0,说明没有被压宿,那么也不需要解压速
- if (buffer[buffer.Length - 1] == 0)
- {
- return bytes;
- }
- using (MemoryStream ms = new MemoryStream(buffer))
- {
- MemoryStream stream = null;
- try
- {
- stream = DeCompressMemoryToMemory(ms);
- stream.SetLength(stream.Position);
- bytes = stream.ToArray();
- }
- finally
- {
- MemoryStreamStacker.ReleaseMemoryStream(stream);
- }
- }
- return bytes;
- }
- }
- }
|