C#實現(xiàn)GZip壓縮和解壓縮入門實例
主要是因為GZipStream的構造函數(shù)中第一個需要傳入一個Stream,第二個是指定操作方式:壓縮還是解壓縮。
當時的疑問點主要有:
1.我傳入的Stream是包含未壓縮數(shù)據(jù)的Stream嗎?
2.我解壓時是從一個壓縮流中讀取數(shù)據(jù)后再用GZipStream解壓嗎?
出現(xiàn)以上兩點疑問,完全是我將GZipStream的用法理解反了。
其實GZipStream里面存的是已經(jīng)壓縮過的數(shù)據(jù)流,傳入的Stream是作為基礎Stream傳入,如果要壓縮,那你就可以傳一個空的Stream進去,如果要解壓,就將包含壓縮數(shù)據(jù)的Stream傳進去。
而GZipStream的讀和寫分別對應的是解壓和壓縮兩個操作,知道了這些,使用起來就簡單了。
寫入的數(shù)據(jù)會被壓縮后寫入到傳入的Stream中,讀取的數(shù)據(jù)也是解壓后的數(shù)據(jù),可以直接寫入到一個新的流中。
byte[] cbytes = null;
//壓縮
using (MemoryStream cms = new MemoryStream())
{
using (System.IO.Compression.GZipStream gzip = new System.IO.Compression.GZipStream(cms,System.IO.Compression.CompressionMode.Compress))
{
//將數(shù)據(jù)寫入基礎流,同時會被壓縮
byte[] bytes = Encoding.UTF8.GetBytes("解壓縮測試");
gzip.Write(bytes, 0, bytes.Length);
}
cbytes = cms.ToArray();
}
//解壓
using (MemoryStream dms = new MemoryStream())
{
using (MemoryStream cms = new MemoryStream(cbytes))
{
using (System.IO.Compression.GZipStream gzip = new System.IO.Compression.GZipStream(cms, System.IO.Compression.CompressionMode.Decompress))
{
byte[] bytes = new byte[1024];
int len = 0;
//讀取壓縮流,同時會被解壓
while ((len = gzip.Read(bytes, 0, bytes.Length)) > 0)
{
dms.Write(bytes, 0, len);
}
}
}
Console.WriteLine(Encoding.UTF8.GetString(dms.ToArray()));
}
同時 在壓縮時傳入的流可以是非空流,你可以在寫入其他數(shù)據(jù)后再寫入壓縮數(shù)據(jù),不會影響最后的結果。
如果你在解壓時遇到“幻數(shù)頭不正確”的提示,是因為你要解壓的數(shù)據(jù)不是用GZip壓縮的。
相關文章
C#獲得MAC地址(網(wǎng)卡序列號)的實現(xiàn)代碼
這篇文章主要介紹了C#獲得MAC地址的實現(xiàn)代碼,需要的朋友可以參考下2014-02-02