.Net zlib inflate with .Net 4.5

前端 未结 3 1135
悲哀的现实
悲哀的现实 2020-12-11 05:43

According to MSDN in .Net 4.5 System.IO.Compression is based on zlib.
I am trying now to change my current interop based reading from a zlib deflated stream from a non .

相关标签:
3条回答
  • 2020-12-11 06:27

    What are the first several bytes of the data you are trying to compress?

    You might have zlib, gzip, or raw deflate data that you're trying to decode.

    By the way, I highly recommend that you use DotNetZip's interface to zlib instead of NET 4.5's (or NET any version). NET 4.5 has bugs in that interface that Microsoft has declared that they won't fix (!).

    0 讨论(0)
  • 2020-12-11 06:48

    The answer above is correct but isn't exactly clear on the "why". The first two bytes of a raw ZLib stream provide details about the type of compression used. Microsoft's DeflateStream class in System.Io.Compression doesn't understand these. The fix is as follows:

    using (MemoryStream ms = new MemoryStream(data))
    {
        MemoryStream msInner = new MemoryStream();
    
        // Read past the first two bytes of the zlib header
        ms.Seek(2, SeekOrigin.Begin);
    
        using (DeflateStream z = new DeflateStream(ms, CompressionMode.Decompress))
        {
            z.CopyTo(msInner);
    

    In this example, data is a Byte[] with the raw Zlib file. After loading it into a MemoryStream, we simply "seek" past the first two bytes.

    The post explains what a Zlib header looks like if you are looking at the raw bytes.

    What does a zlib header look like?

    0 讨论(0)
  • 2020-12-11 06:49

    Here's a revised version of ProVega's answer, which inflates the byte array into a string:

    using (var stream = new MemoryStream(bytes,2, bytes.Length - 2))
    using (var inflater = new DeflateStream(stream, CompressionMode.Decompress))
    using (var streamReader = new StreamReader(inflater))
    {
        return streamReader.ReadToEnd();
    }
    
    0 讨论(0)
提交回复
热议问题