2008-09-16 133 views

回答

9

MSDN約System.IO.Compression.GZipStream:

此類表示gzip的數據格式,它使用無損文件壓縮和解壓的工業標準算法。

zlib FAQ

的GZ *功能的zlib,另一方面使用gzip格式。

因此zlib和GZipStream應該可以互操作,但只有在您使用zlib函數來處理gzip格式時。據報道,System.IO.Compression.Deflate和zlib不可互操作。

如果您需要處理zip文件(您可能不需要,但其他人可能需要此操作),則需要使用SharpZipLib或其他第三方庫。

+1

zip文件與zlib壓縮文件不同(壓縮算法可能相同,但標頭不相同) – 2008-10-09 15:26:19

+0

您是對的。我會編輯我的迴應。 – 2008-10-12 08:27:20

2

他們只是使用zlib或deflate算法壓縮數據,但不提供某些特定文件格式的輸出。這意味着,如果您將流原樣存儲到硬盤驅動器,很可能您將無法使用某些應用程序(gzip或winrar)打開它,因爲文件頭(幻數等)不包含在流中,您應該自己寫。

0

我同意andreas。您可能無法在外部工具中打開該文件,但如果該工具需要某個流,則可以使用該文件。您還可以使用相同的壓縮類將文件壓縮回去。

3

gzip是deflate +某些頁眉/頁腳數據,如校驗和和長度等。因此,它們在一種方法可以使用另一種方法的流方面不兼容,但它們使用相同的壓縮算法。

6

我已經使用GZipStream來壓縮.NET XmlSerializer的輸出,並且它已經很好地用gunzip(在cygwin中),winzip和另一個GZipStream解壓縮結果。

以供參考,這是我的代碼所做的:

FileStream fs = new FileStream(filename, FileMode.Create, FileAccess.Write); 
using (GZipStream gzStream = new GZipStream(fs, CompressionMode.Compress)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); 
    serializer.Serialize(gzStream, myData); 
} 

然後,在C#

FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); 
using (Stream input = new GZipStream(fs, CompressionMode.Decompress)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(MyDataType)); 
    myData = (MyDataType) serializer.Deserialize(input); 
} 

解壓縮使用「文件」工具Cygwin中顯示,確實存在之間的差異使用GZipStream和GNU GZip壓縮的相同文件(可能是其他人在此線程中聲明的標題信息)。但是,這種差異在實踐中似乎並不重要。

14

DotNetZip包含一個DeflateStream,一個ZlibStream和一個GZipStream,用於處理RFC 1950,1951和1952.全部使用DEFLATE算法,但每個幀的幀和頭字節都不相同。

作爲一個優勢,DotNetZip中的流不會顯示壓縮下的anomaly of expanding data size,這是針對內置流報告的。此外,沒有內置的ZlibStream,而DotNetZip爲您提供了這一點,以便與zlib進行良好的互操作。

12

我遇到了Git對象的這個問題。在這種情況下,他們將對象存儲爲帶有Zlib標頭的放氣斑點,這在RFC 1950中有記錄。可以通過使一個包含文件做出兼容斑點:

  • 兩個報頭字節(從RFC 1950 CMF和FLG)具有值0x78 0x01
    • CM = 8 =放氣
    • CINFO = 7 = 32Kb的窗口
    • 用於該標題
  • 的輸出
  • FCHECK = 1 =校驗和的比特輸入數據的C#DeflateStream
  • 的Adler32校驗的DeflateStream,big-endian格式(MSB第一)

我做我自己的阿德勒實施

public class Adler32Computer 
{ 
    private int a = 1; 
    private int b = 0; 

    public int Checksum 
    { 
     get 
     { 
      return ((b * 65536) + a); 
     } 
    } 

    private static readonly int Modulus = 65521; 

    public void Update(byte[] data, int offset, int length) 
    { 
     for (int counter = 0; counter < length; ++counter) 
     { 
      a = (a + (data[offset + counter])) % Modulus; 
      b = (b + a) % Modulus; 
     } 
    } 
} 

,那是相當多了。

1

從.NET Framework 4.5開始,System.IO.Compression.DeflateStream類使用zlib庫。

從類的MSDN article

此類表示deflate算法,這是一種無損文件壓縮和解壓的業界標準算法。從.NET Framework 4.5開始,DeflateStream類使用zlib庫。因此,它提供了一種更好的壓縮算法,並且在大多數情況下,它提供的壓縮文件比早期版本的.NET Framework提供的壓縮文件要小。