System.IO.Compression.GZipStream或System.IO.Compression.Deflate是否與zlib壓縮兼容?Zlib兼容壓縮流?
回答
從MSDN約System.IO.Compression.GZipStream:
此類表示gzip的數據格式,它使用無損文件壓縮和解壓的工業標準算法。
從zlib FAQ:
的GZ *功能的zlib,另一方面使用gzip格式。
因此zlib和GZipStream應該可以互操作,但只有在您使用zlib函數來處理gzip格式時。據報道,System.IO.Compression.Deflate和zlib不可互操作。
如果您需要處理zip文件(您可能不需要,但其他人可能需要此操作),則需要使用SharpZipLib或其他第三方庫。
他們只是使用zlib或deflate算法壓縮數據,但不提供某些特定文件格式的輸出。這意味着,如果您將流原樣存儲到硬盤驅動器,很可能您將無法使用某些應用程序(gzip或winrar)打開它,因爲文件頭(幻數等)不包含在流中,您應該自己寫。
我同意andreas。您可能無法在外部工具中打開該文件,但如果該工具需要某個流,則可以使用該文件。您還可以使用相同的壓縮類將文件壓縮回去。
gzip是deflate +某些頁眉/頁腳數據,如校驗和和長度等。因此,它們在一種方法可以使用另一種方法的流方面不兼容,但它們使用相同的壓縮算法。
我已經使用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壓縮的相同文件(可能是其他人在此線程中聲明的標題信息)。但是,這種差異在實踐中似乎並不重要。
DotNetZip包含一個DeflateStream,一個ZlibStream和一個GZipStream,用於處理RFC 1950,1951和1952.全部使用DEFLATE算法,但每個幀的幀和頭字節都不相同。
作爲一個優勢,DotNetZip中的流不會顯示壓縮下的anomaly of expanding data size,這是針對內置流報告的。此外,沒有內置的ZlibStream,而DotNetZip爲您提供了這一點,以便與zlib進行良好的互操作。
我遇到了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;
}
}
}
,那是相當多了。
從.NET Framework 4.5開始,System.IO.Compression.DeflateStream
類使用zlib庫。
從類的MSDN article:
此類表示deflate算法,這是一種無損文件壓縮和解壓的業界標準算法。從.NET Framework 4.5開始,DeflateStream類使用zlib庫。因此,它提供了一種更好的壓縮算法,並且在大多數情況下,它提供的壓縮文件比早期版本的.NET Framework提供的壓縮文件要小。
- 1. Zlib壓縮boost :: iostreams與zlib.NET不兼容
- 2. 解壓縮Zlib
- 3. ZLIB解壓縮
- 4. ZLIB壓縮
- 5. Zlib壓縮不兼容C vs C#實現
- 6. 查找zlib壓縮流的結尾
- 7. zlib:壓縮流總是一樣的嗎?
- 8. zlib,如何解壓縮壓縮數據塊的流?
- 9. zlib壓縮和解壓
- 10. zlib壓縮錯誤
- 11. ASIHTTPRequest的zlib壓縮
- 12. zlib/libz.dylib解壓縮
- 13. Zlib解壓縮C++
- 14. 壓縮與imagepng不兼容
- 15. 的zlib壓縮/解壓縮Linux編程
- 16. 使用zlib解壓縮PNG
- 17. 通過PHP Zlib壓縮
- 18. 壓縮不zlib庫工作
- 19. 的Node.js - zlib壓縮(RFC 1950)
- 20. Zlib壓縮放大文件
- 21. 解壓縮zlib編碼nsdata
- 22. zlib gzopen()返回一個壓縮文件流。它解壓縮文件嗎?
- 23. 用pako壓縮(javascript中的zlib),用zlib(python)解壓縮不起作用
- 24. C#/ Android兼容壓縮算法
- 25. XML壓縮兼容Java和C#
- 26. UISaveVideoAtPathToSavedPhotosAlbum不兼容?需要壓縮?
- 27. python中的UTF-8兼容壓縮
- 28. 如何使用zlib在ruby中實時壓縮文件流
- 29. 試圖壓縮zlib格式的低層訪問流
- 30. 如何讓Zlib壓縮成Ruby中的流?
zip文件與zlib壓縮文件不同(壓縮算法可能相同,但標頭不相同) – 2008-10-09 15:26:19
您是對的。我會編輯我的迴應。 – 2008-10-12 08:27:20