解压缩二进制文件的ZLIB压缩部分

时间:2009-11-15 19:17:35

标签: .net f# gzipstream

我正在从.Net 3.5中读取一个文件(flash swf),该文件有一个标题,说明文件/ Stream的主体是否被压缩。但是,我遇到了问题 - 在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....

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

尝试使用DeflateStream,“ZLIB”不会自动表示GZip。