Dot-Net

.NET GZipStream 壓縮和解壓

  • December 25, 2015

下面這段程式碼有什麼問題。我總是得到 FALSE,這意味著壓縮後,解壓縮的數據與原始值不匹配。

public static bool Test()
       {
           string sample = "This is a compression test of microsoft .net gzip compression method and decompression methods";
           System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();
           byte[] data = encoding.GetBytes(sample);
           bool result = false;

           //Compress
           MemoryStream cmpStream;
           cmpStream = new MemoryStream();
           GZipStream hgs = new GZipStream(cmpStream, CompressionMode.Compress);
           hgs.Write(data, 0, data.Length);
           byte[] cmpData = cmpStream.ToArray();

           MemoryStream decomStream;
           decomStream = new MemoryStream(cmpData);
           hgs = new GZipStream(decomStream, CompressionMode.Decompress);
           hgs.Read(data, 0, data.Length);

           string sampleOut = System.BitConverter.ToString(data);

           result = String.Equals(sample, sampleOut) ;
           return result;
       }

如果您能指出我在哪裡犯了錯誤,我將不勝感激。

試試這個程式碼:

public static bool Test()
       {
           string sample = "This is a compression test of microsoft .net gzip compression method and decompression methods";

           System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

           byte[] data = encoding.GetBytes(sample);
           bool result = false;

           // Compress
           MemoryStream cmpStream = new MemoryStream();

           GZipStream hgs = new GZipStream(cmpStream, CompressionMode.Compress);

           hgs.Write(data, 0, data.Length);

           byte[] cmpData = cmpStream.ToArray();

           MemoryStream decomStream = new MemoryStream(cmpData);

           hgs = new GZipStream(decomStream, CompressionMode.Decompress);
           hgs.Read(data, 0, data.Length);

           string sampleOut = encoding.GetString(data);

           result = String.Equals(sample, sampleOut);
           return result;
       }

問題是您沒有使用 ASCIIEncoder 來獲取 sampleData 的字元串。

編輯:這是程式碼的清理版本,以幫助關閉/處置:

public static bool Test()
       {
           string sample = "This is a compression test of microsoft .net gzip compression method and decompression methods";

           System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding();

           byte[] data = encoding.GetBytes(sample);

           // Compress.
           GZipStream hgs;
           byte[] cmpData;

           using(MemoryStream cmpStream = new MemoryStream())
           using(hgs = new GZipStream(cmpStream, CompressionMode.Compress))
           {
               hgs.Write(data, 0, data.Length);
               hgs.Close()

               // Do this AFTER the stream is closed which sounds counter intuitive 
               // but if you do it before the stream will not be flushed
               // (even if you call flush which has a null implementation).
               cmpData = cmpStream.ToArray();
           }  

           using(MemoryStream decomStream = new MemoryStream(cmpData))
           using(hgs = new GZipStream(decomStream, CompressionMode.Decompress))
           {
               hgs.Read(data, 0, data.Length);
           }

           string sampleOut = encoding.GetString(data);

           bool result = String.Equals(sample, sampleOut);
           return result;
       }

GZipStream通話後關閉Write

如果不呼叫Close,則可能會緩衝某些數據並且尚未寫入底層流。

引用自:https://stackoverflow.com/questions/1590846