@@ -16,8 +16,10 @@ public static class StreamCompressors
1616 {
1717#if NET6_0_OR_GREATER
1818 { "br" , BrotliCompressor . Instance } , //CompressionTypes.Brotli
19- #endif
19+ { CompressionTypes . Deflate , ZLibCompressor . Instance } ,
20+ #else
2021 { CompressionTypes . Deflate , DeflateCompressor . Instance } ,
22+ #endif
2123 { CompressionTypes . GZip , GZipCompressor . Instance } ,
2224 } ;
2325
@@ -93,8 +95,49 @@ public byte[] DecompressBytes(byte[] zipBuffer)
9395 return zipStream . ReadFully ( ) ;
9496 }
9597}
96- #endif
9798
99+ public class ZLibCompressor : IStreamCompressor
100+ {
101+ public string Encoding => CompressionTypes . Deflate ;
102+ public static ZLibCompressor Instance { get ; } = new ( ) ;
103+
104+ public byte [ ] Compress ( string text , Encoding ? encoding = null ) => Compress ( ( encoding ?? System . Text . Encoding . UTF8 ) . GetBytes ( text ) ) ;
105+
106+ public byte [ ] Compress ( byte [ ] bytes )
107+ {
108+ // In .NET FX incompatible, you can't access compressed bytes without closing DeflateStream
109+ // Which means we must use MemoryStream since you have to use ToArray() on a closed Stream
110+ using var ms = new MemoryStream ( ) ;
111+ using var zipStream = new ZLibStream ( ms , CompressionMode . Compress ) ;
112+ zipStream . Write ( bytes , 0 , bytes . Length ) ;
113+ zipStream . Close ( ) ;
114+
115+ return ms . ToArray ( ) ;
116+ }
117+
118+ public Stream Compress ( Stream outputStream , bool leaveOpen = false ) =>
119+ new ZLibStream ( outputStream , CompressionMode . Compress , leaveOpen ) ;
120+
121+ public string Decompress ( byte [ ] zipBuffer , Encoding ? encoding = null )
122+ {
123+ using var uncompressedStream = MemoryStreamFactory . GetStream ( ) ;
124+ using var compressedStream = MemoryStreamFactory . GetStream ( zipBuffer ) ;
125+ using var zipStream = new ZLibStream ( compressedStream , CompressionMode . Decompress ) ;
126+ zipStream . CopyTo ( uncompressedStream ) ;
127+ return uncompressedStream . ReadToEnd ( encoding ?? System . Text . Encoding . UTF8 ) ;
128+ }
129+
130+ public Stream Decompress ( Stream zipBuffer , bool leaveOpen = false ) =>
131+ new DeflateStream ( zipBuffer , CompressionMode . Decompress , leaveOpen ) ;
132+
133+ public byte [ ] DecompressBytes ( byte [ ] zipBuffer )
134+ {
135+ using var compressedStream = zipBuffer . InMemoryStream ( ) ;
136+ using var zipStream = new ZLibStream ( compressedStream , CompressionMode . Decompress ) ;
137+ return zipStream . ReadFully ( ) ;
138+ }
139+ }
140+ #endif
98141
99142public class DeflateCompressor : IStreamCompressor
100143{
0 commit comments