2009-11-15 4 views
0

Je lis un fichier (un swf flash) de .Net 3.5 qui a un en-tête qui indique si le corps du fichier/Stream est compressé ou non. Cependant, j'ai des problèmes - après avoir réemballé le flux de fichiers de base dans un GZipStream, je reçois une exception indiquant que "Le nombre magique dans l'en-tête de GZip n'est pas correct. Assurez-vous que vous passez dans un flux GZip." Même s'il se peut que je ne comprenne pas comment le fichier SWF est formaté (la documentation d'Adobe indique seulement que le corps est "compressé à l'aide du standard ouvert ZLIB." Le format de données utilisé par la bibliothèque ZLIB est décrit dans Request for Commentaires (RFC) documents 1950 à 1952. "), il se peut aussi que je ne comprends pas comment fonctionne GZipStream.Décompression des portions compressées ZLIB d'un fichier binaire

Donc, ma question est double: 1) GZipStream fonctionnera-t-il généralement correctement lorsqu'il est remis à un flux parent qui a déjà été lu?
2) GZipStream fonctionne-t-il avec des données compressées de cette manière? Et sinon, y a-t-il d'autres librairies open source que vous recommanderiez d'utiliser?

merci.

Pour votre information, voici le Snipped du code correspondant (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.... 

Répondre

1

DeflateStream ne veut pas l'en-tête ZLIB (120, -100), et ne consommera pas l'Adler32 ultérieur. J'ai quelques notes sur la façon de rendre le DeflateStream correspondre aux flux java.util.ziphere. Et si tout le reste échoue, il y a aussi un port of the Java port of ZLib.

+0

Merci pour l'aide Steve! Le port du port de ZLib semble avoir fait le tour! C'est logique, en fait: le compilateur Flash ActionScript 3 est écrit en Java. –

0

Essayez d'utiliser la place DeflateStream, "zlib" ne signifie pas automatiquement GZip.

+1

Merci pour la suggestion, mais que l'on craps avec "La longueur du bloc ne correspond pas à son complément." –

+0

Eh bien, alors il est temps de creuser dans la description du format flash. –