【问题标题】:Unzipping ZLIB compressed portions of a binary file解压缩二进制文件的 ZLIB 压缩部分
【发布时间】:2009-11-15 19:17:35
【问题描述】:

我正在从 .Net 3.5 中读取一个文件(一个 flash swf),该文件的标题表明文件/流的主体是否被压缩。但是,我遇到了问题——在将基本文件流重新包装到 GZipStream 中后,我收到一个异常,指出“GZip 标头中的幻数不正确。请确保您正在传递 GZip 流。”

虽然我可能不了解 SWF 的格式(Adobe 的文档仅声明正文是“使用 ZLIB 开放标准压缩的。ZLIB 库使用的数据格式在 Request for Comments 中描述(RFC)文档 1950 到 1952。”),也可能是我不了解 GZipStream 的工作原理。

所以我的问题是双重的: 1) GZipStream 在处理已读取的父流时通常会正常工作吗?
2) GZipStream 是否可以处理以这种方式压缩的数据?如果没有,您是否推荐使用其他开源库?

谢谢。

仅供参考,以下是相关代码的片段(F#):

let reader= match signature with 
            |['F';'W';'S']-> //uncompresssed
                             reader
            |['C';'W';'S']->
                             let gzs= new System.IO.Compression.GZipStream(reader.BaseStream, System.IO.Compression.CompressionMode.Decompress)
                             new BinaryReader(gzs)
            |_-> failwith "something is invalid in this header"
let frameSB = List.nth ((reader.PeekChar()|>BitConverter.GetBytes)|>List.ofArray) 0 in
let frameSize = frameSB&&&31uy |> (+) 5uy |> fun fs-> fs+ 8uy-(fs%8uy) //rect data structure....

【问题讨论】:

    标签: .net f# gzipstream


    【解决方案1】:

    DeflateStream 不需要 (120,-100) ZLIB 标头,也不会消耗后续的 Adler32。我有一些关于如何使DeflateStream 匹配java.util.ziphere 的注释。如果所有其他方法都失败了,还有一个port of the Java port of ZLib

    【讨论】:

    • 感谢史蒂夫的帮助! ZLib 的端口似乎已经成功了!实际上,这是有道理的:Flash Actionscript 3 编译器是用 java 编写的。
    【解决方案2】:

    尝试改用 DeflateStream,“ZLIB”并不自动表示 GZip。

    【讨论】:

    • 感谢您的建议,但有人说“块长度与其补码不匹配”。
    • 那么,是时候深入了解 Flash 格式说明了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多