我似乎无法获得Flex 3想要解压缩的流。

我试过了:

  • System.IO.Compression.GZipStream
  • System.IO.Compression.DeflateStream
  • ICSharpCode.SharpZipLib.Zip.Compression.Streams.DeflaterOutputStream
  • zlib.ZOutputStream

  • 这些似乎都不会使ByteArray.uncompress开心,即我得到



    同样,整个Deflate vs zlib也让我转圈。

    根据wikipedia的文章,zlib似乎是DEFLATE的实现。但是根据Actionscript,它们是两个不同的事物吗?

    微软似乎也表明Gzip至少使用Deflate算法,因为在他们的文档中,他们提到GZipOutputStream使用与DeflateStream相同的压缩算法。因此,我假设这只是 header 差异,这表明就“ByteArray.uncompress”而言,这是“不好的”,因为仅在AIR应用程序中支持“DEFLATE”算法。

    示例“服务器”代码,在这种情况下使用SharpZipLib(不起作用):
        public virtual bool ProcessRequest(string path, HttpListenerContext context)
        {
            var buffer = File.ReadAllBytes(path);
            // Specifying to strip header/footer from data as that seems to be what the
            // docs for ByteArray.uncompress indicate is necessary
            var deflater = new Deflater(Deflater.DEFAULT_COMPRESSION, true);
            using (var zipStream = new DeflaterOutputStream(context.Response.OutputStream, deflater))
            {
                zipStream.Write(buffer, 0, buffer.Length);
            }
        }
    

    最佳答案

    ZLIB和DEFLATE不同。 IETF RFC中定义了一组3个相关的压缩规范:

  • RFC 1950,ZLIB
  • RFC 1951,DEFLATE
  • RFC 1952,GZIP

  • 它们都(主要)使用特定的压缩算法DEFLATE。

    ZLIB如何关联到DEFLATE

    第一个ZLIB在开头包含成帧字节。根据RFC 1950 ...
      A zlib stream has the following structure:
    
           0   1
         +---+---+
         |CMF|FLG|   (more-->)
         +---+---+
    
      (if FLG.FDICT set)
    
           0   1   2   3
         +---+---+---+---+
         |     DICTID    |   (more-->)
         +---+---+---+---+
    
         +=====================+---+---+---+---+
         |...compressed data...|    ADLER32    |
         +=====================+---+---+---+---+
    

    CMF和FLG是字节。正如规范所说,ZLIB中使用的主要压缩方法是DEFLATE,尽管该规范可以与其他方法一起使用。通常不是。另外,通常不使用DICTID 。因此,每个ZLIB字节流都有2个字节,然后是压缩数据流,然后是Adler32校验和。压缩的数据是来自DEFLATE的裸露字节流。

    GZIP如何关联到DEFLATE

    这照顾到ZLIB作为格式与DEFLATE有何不同。 GZIP是第三种格式。如果需要详细信息,请检查RFC。关键是与ZLIB一样,GZIP主要使用DEFLATE,并将 header 放在压缩数据流之前,然后放在校验和之后。但是GZIP header 与ZLIB header 不同,因此任何GZipStream类都将无法编写将被读取为ZLIB的字节流。反之亦然。

    解决问题

    读取ZLIB流时,在将流推进到前两个ZLIB成帧字节之后,使用.NET的内置DeflateStream对数据流添加some people address the problem you experienced。只要您要读取,ZLIB流就使用DEFLATE(安全假设)并且它没有定义固定的字典(也很安全),并且如果您不关心Adler32提供的完整性检查(也许)。

    如果您不喜欢做这些假设或放弃检查,或者您必须生成一个ZLIB数据流,则ZlibStream中有一个DotNetZip,它将为您读取和写入ZLIB数据流,并根据需要验证或产生校验和。

    DotNetZip是免费使用的,可与任何.NET语言一起使用。您不需要完整的DotNetZip库,而是只需要Ionic.Zlib.dll。

    关于c# - .NET zlib流与Actionscript ByteArray.uncompress兼容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1545973/

    10-13 06:20