ningshuxia
2023-02-24 02c4ea4b4cbc946a733bb864b2ae587b0cd0be43
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Zip;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace IStation
{
    public class Compression
    { 
        /// <summary>
        /// 压缩方式。
        /// </summary>
        public enum CompressionType
        {
            /// <summary>
            /// GZip 压缩格式
            /// </summary>
            GZip,
            /// <summary>
            /// BZip2 压缩格式
            /// </summary>
            BZip2,
            /// <summary>
            /// Zip 压缩格式
            /// </summary>
            Zip
        }
 
        /// <summary>
        /// 使用 SharpZipLib 进行压缩的辅助类,简化对字节数组和字符串进行压缩的操作。
        /// </summary>
        public class CompressionHelper
        {
            /// <summary>
            /// 压缩供应者,默认为 GZip。
            /// </summary>
            public static CompressionType CompressionProvider = CompressionType.GZip;
 
            #region Public methods
 
            /// <summary>
            /// 从原始字节数组生成已压缩的字节数组。
            /// </summary>
            /// <param name="bytesToCompress">原始字节数组。</param>
            /// <returns>返回已压缩的字节数组</returns>
            public static byte[] Compress(byte[] bytesToCompress)
            {
                MemoryStream ms = new MemoryStream();
                Stream s = OutputStream(ms);
                s.Write(bytesToCompress, 0, bytesToCompress.Length);
                s.Close();
                return ms.ToArray();
            }
 
            /// <summary>
            /// 从原始字符串生成已压缩的字符串。
            /// </summary>
            /// <param name="stringToCompress">原始字符串。</param>
            /// <returns>返回已压缩的字符串。</returns>
            public static string Compress(string stringToCompress)
            {
                byte[] compressedData = CompressToByte(stringToCompress);
                string strOut = Convert.ToBase64String(compressedData);
                return strOut;
            }
 
            /// <summary>
            /// 从原始字符串生成已压缩的字节数组。
            /// </summary>
            /// <param name="stringToCompress">原始字符串。</param>
            /// <returns>返回已压缩的字节数组。</returns>
            public static byte[] CompressToByte(string stringToCompress)
            {
                byte[] bytData = Encoding.Unicode.GetBytes(stringToCompress);
                return Compress(bytData);
            }
 
            /// <summary>
            /// 从已压缩的字符串生成原始字符串。
            /// </summary>
            /// <param name="stringToDecompress">已压缩的字符串。</param>
            /// <returns>返回原始字符串。</returns>
            public string DeCompress(string stringToDecompress)
            {
                string outString = string.Empty;
                if (stringToDecompress == null)
                {
                    throw new ArgumentNullException("stringToDecompress", "You tried to use an empty string");
                }
 
                try
                {
                    byte[] inArr = Convert.FromBase64String(stringToDecompress.Trim());
                    outString = Encoding.Unicode.GetString(DeCompress(inArr));
                }
                catch (NullReferenceException nEx)
                {
                    return nEx.Message;
                }
 
                return outString;
            }
 
            /// <summary>
            /// 从已压缩的字节数组生成原始字节数组。
            /// </summary>
            /// <param name="bytesToDecompress">已压缩的字节数组。</param>
            /// <returns>返回原始字节数组。</returns>
            public static byte[] DeCompress(byte[] bytesToDecompress)
            {
                byte[] writeData = new byte[4096];
                Stream s2 = InputStream(new MemoryStream(bytesToDecompress));
                MemoryStream outStream = new MemoryStream();
                while (true)
                {
                    int size = s2.Read(writeData, 0, writeData.Length);
                    if (size > 0)
                    {
                        outStream.Write(writeData, 0, size);
                    }
                    else
                    {
                        break;
                    }
                }
                s2.Close();
                byte[] outArr = outStream.ToArray();
                outStream.Close();
                return outArr;
            }
 
            #endregion
 
            #region Private methods
 
            /// <summary>
            /// 从给定的流生成压缩输出流。
            /// </summary>
            /// <param name="inputStream">原始流。</param>
            /// <returns>返回压缩输出流。</returns>
            private static Stream OutputStream(Stream inputStream)
            {
                switch (CompressionProvider)
                {
                    case CompressionType.BZip2:
                        return new BZip2OutputStream(inputStream);
 
                    case CompressionType.GZip:
                        return new GZipOutputStream(inputStream);
 
                    case CompressionType.Zip:
                        return new ZipOutputStream(inputStream);
 
                    default:
                        return new GZipOutputStream(inputStream);
                }
            }
 
            /// <summary>
            /// 从给定的流生成压缩输入流。
            /// </summary>
            /// <param name="inputStream">原始流。</param>
            /// <returns>返回压缩输入流。</returns>
            private static Stream InputStream(Stream inputStream)
            {
                switch (CompressionProvider)
                {
                    case CompressionType.BZip2:
                        return new BZip2InputStream(inputStream);
 
                    case CompressionType.GZip:
                        return new GZipInputStream(inputStream);
 
                    case CompressionType.Zip:
                        return new ZipInputStream(inputStream);
 
                    default:
                        return new GZipInputStream(inputStream);
                }
            }
 
            #endregion
        }
    }
}