Dot-Net
.NET GZipStream 壓縮和解壓
下面這段程式碼有什麼問題。我總是得到 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,則可能會緩衝某些數據並且尚未寫入底層流。