Распаковка сжатых ZLIB частей двоичного файла - PullRequest
0 голосов
/ 15 ноября 2009

Я читаю файл (flash swf) из .Net 3.5 с заголовком, в котором указано, сжато ли тело файла / потока или нет. Однако у меня возникают проблемы - после того, как я перезаписываю основной поток файлов в GZipStream, я получаю исключение, утверждающее, что «магическое число в заголовке GZip неверно. Убедитесь, что вы передаете поток GZip».

Хотя, возможно, я не понимаю, как отформатирован SWF-файл (в документации Adobe говорится только о том, что тело "сжато с использованием открытого стандарта ZLIB. Формат данных, который использует библиотека ZLIB, описывается в Запросе комментариев". (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 ]

1 голос
/ 15 ноября 2009

DeflateStream не хочет (120, -100) заголовок ZLIB и не будет использовать последующий Adler32. У меня есть некоторые заметки о том, как заставить DeflateStream соответствовать java.util.zip потокам здесь . И если все остальное терпит неудачу, есть также порт порта Java ZLib вокруг.

0 голосов
/ 15 ноября 2009

Попробуйте вместо этого использовать DeflateStream, "ZLIB" не означает автоматически GZip.

...