Compressor.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using System;
  2. using System.Collections;
  3. using System.ComponentModel;
  4. using System.IO;
  5. using System.IO.Compression;
  6. using System.Text;
  7. namespace FastReport.Utils
  8. {
  9. internal static class Compressor
  10. {
  11. public static Stream Decompress(Stream source, bool bidiStream)
  12. {
  13. if (IsStreamCompressed(source))
  14. {
  15. if (bidiStream)
  16. {
  17. // create bidirectional stream
  18. Stream stream = new MemoryStream();
  19. using (GZipStream gzip = new GZipStream(source, CompressionMode.Decompress))
  20. {
  21. const int BUFFER_SIZE = 4096;
  22. gzip.CopyTo(stream, BUFFER_SIZE);
  23. }
  24. stream.Position = 0;
  25. return stream;
  26. }
  27. else
  28. return new GZipStream(source, CompressionMode.Decompress);
  29. }
  30. return null;
  31. }
  32. public static Stream Compress(Stream dest)
  33. {
  34. return new GZipStream(dest, CompressionMode.Compress, true);
  35. }
  36. public static byte[] Compress(byte[] buffer)
  37. {
  38. using (MemoryStream dest = new MemoryStream())
  39. {
  40. using (Stream gzipStream = new GZipStream(dest, CompressionMode.Compress, true))
  41. {
  42. gzipStream.Write(buffer, 0, buffer.Length);
  43. }
  44. return dest.ToArray();
  45. }
  46. }
  47. public static string Compress(string source)
  48. {
  49. byte[] srcBytes = Encoding.UTF8.GetBytes(source);
  50. byte[] compressedBytes = Compress(srcBytes);
  51. return Convert.ToBase64String(compressedBytes);
  52. }
  53. public static byte[] Decompress(byte[] buffer)
  54. {
  55. using (MemoryStream ms = new MemoryStream(buffer))
  56. {
  57. if (IsStreamCompressed(ms))
  58. {
  59. using (MemoryStream uncompressedStream = Compressor.Decompress(ms, true) as MemoryStream)
  60. {
  61. return uncompressedStream.ToArray();
  62. }
  63. }
  64. else
  65. {
  66. return buffer;
  67. }
  68. }
  69. }
  70. public static string Decompress(string source)
  71. {
  72. byte[] srcBytes = Convert.FromBase64String(source);
  73. byte[] decompressedBytes = Compressor.Decompress(srcBytes);
  74. return Encoding.UTF8.GetString(decompressedBytes);
  75. }
  76. public static bool IsStreamCompressed(Stream stream)
  77. {
  78. int byte1 = stream.ReadByte();
  79. int byte2 = stream.ReadByte();
  80. stream.Position -= 2;
  81. return byte1 == 0x1F && byte2 == 0x8B;
  82. }
  83. }
  84. }