2009-11-15 1 views
0

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

Возможно, я не понимаю, как SWF отформатирован (документация Adobe заявляет только, что тело «сжато с использованием открытого стандарта ZLIB». Формат данных, который использует библиотека ZLIB, описывается Request for Комментарии (RFC) с 1950 по 1952 год »), также может случиться так, что я не понимаю, как работает GZipStream.

Итак, мой вопрос двоякий: 1) Будет ли GZipStream работать нормально, когда передается родительский поток, который уже был прочитан?
2) Работает ли GZipStream с сжатыми данными таким образом? А если нет, есть ли другая библиотека с открытым исходным кодом, которую вы бы рекомендовали использовать?

спасибо.

FYI, вот отрезала соответствующего кода (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.... 

ответ

1

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

+0

Спасибо за помощь Стив! Порт порта ZLib, похоже, сделал трюк! Это имеет смысл, на самом деле: компилятор Flash Actionscript 3 написан в java. –

0

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

+1

Благодарим вас за предложение, но этот треск с «длиной блока не соответствует его дополнению». –

+0

Ну, тогда пришло время вникать в описание формата вспышки. –