我正在从.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....
答案 0 :(得分:1)
DeflateStream
不需要(120,-100)ZLIB标头,也不会使用后续的Adler32。我有一些关于如何DeflateStream
匹配java.util.zip
流here的说明。如果所有其他方法都失败了,那么也会有port of the Java port of ZLib。
答案 1 :(得分:0)
尝试使用DeflateStream,“ZLIB”不会自动表示GZip。