0

我正在从 .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....
4

2 回答 2

1

DeflateStream不想要 (120,-100) ZLIB 标头,也不会消耗后续的 Adler32。我有一些关于如何在此处DeflateStream匹配java.util.zip流的注释。如果一切都失败了,周围还有一个ZLib 的 Java 端口

于 2009-11-15T19:43:45.297 回答
0

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

于 2009-11-15T19:22:36.907 回答