Que fait un zlib-tête ressembler?
Dans mon projet j'ai besoin de savoir ce qu'est un zlib
en-tête ressemble. J'ai entendu dire que c'est plutôt simple mais je ne trouve aucune description de la librairie zlib-tête.
Par exemple, elle contient un nombre magique?
Vous devez vous connecter pour publier un commentaire.
Lien vers la RFC
CMF (Méthode de Compression et de drapeaux)
Cet octet est divisé en 4 bits mode de compression et de 4
peu d'informations de terrain selon la méthode de compression.
CM (méthode de Compression)
C'est l'identification de la méthode de compression utilisée dans le fichier.
CM = 8
indique le "dégonfler" méthode de compression avec une taille de fenêtre jusqu'
à 32 ko. C'est la méthode utilisée par gzip et PNG et presque tout le reste.
CM = 15 est réservé.
CINFO (Compression info)
Pour la CM = 8, CINFO est le logarithme en base 2 de la LZ77 fenêtre
taille, moins de huit (CINFO=7 indique une 32K la taille de la fenêtre). Les valeurs
de CINFO au-dessus de 7 ne sont pas autorisés dans cette version de la
spécification. CINFO n'est pas défini dans cette spécification de
CM ne sont pas égales à 8.
Dans la pratique, cela signifie que le premier octet est presque toujours
78
(hex)FLG (Drapeaux)
Ce drapeau de l'octet est divisé comme suit:
La FCHECK valeur doit être telle que la CMF et FLG, lorsqu'on la considère comme
un entier non signé 16 bits stockés dans de l'ESM de commande (CMF*256 + FLG),
est un multiple de 31.
FLEVEL (niveau de Compression)
Ces indicateurs sont disponibles pour une utilisation par compression spécifique
des méthodes. Le "dégonfler" la méthode (
CM = 8
) définit ces drapeauxsuit:
zlib-tête magique
Suivant est le Zlib données compressées au format.
Surtout,
FLG.FDICT
(Dictionnaire drapeau) n'est pas définie. Dans de tels cas, leDICTID
est tout simplement pas présent. Ainsi, le total de l'entendre, c'est juste 2 octets.Les valeurs d'en-tête(
CMF
etFLG
) avec aucun dictionnaire, sont définis comme suit.Plus à ZLIB RFC
ZLIB/GZIP-têtes
Dégonfler n'ont pas de commune-têtes
ZLIB-tête (tel que défini dans RFC1950) est un 16 bits, big-endian valeur. Il contient les champs de la plus à la moins importante:
CINFO
bits (12-15)Indique la taille de la fenêtre comme une puissance de deux, de 0 (256) 7 (32768). 7 est d'habitude. Des valeurs plus élevées ne sont pas autorisés.
CM
(bits 8 à 11)La méthode de compression. Seulement Dégonfler (8) est autorisée.
FLEVEL
(bits 6-7)Environ indique le niveau de compression, du fast/bas (0) pour ralentir/haut (3)
FDICT
(bit 5)Indique si un preset dictionnaire est utilisé. C'est généralement de 0. 1 est techniquement autorisé, mais je ne sais pas du tout Dégonfler les formats de définir preset dictionnaires.
FCHECK
(bits 0 à 4)Une somme de contrôle, dont la valeur est calculée de telle façon que l'ensemble de la valeur divise 31 sans reste.*
En général, seul le
CINFO
etFLEVEL
champs peuvent être librement modifiés. Il n'y a pas le choix dans ce que les autres champs contiennent, donc un total de seulement 32 possible les en-têtes sont valides. Ici, ils sont:La
CINFO
champ est rarement, si jamais, défini par les compresseurs d'être autre chose qu'7 (qui indique la capacité maximale de 32 ko de la fenêtre), de sorte que les seules valeurs que vous êtes susceptible de voir dans la nature, sont les quatre dans la rangée du bas (à partir de la78
).* (vous pourriez Vous demander si il y a une petite quantité de marge de manœuvre sur la valeur de
FCHECK
- pourrait-elle être définie sur 0 ou 31 si les deux passent la somme de contrôle? En pratique, cependant, il n'y a pas valable en-têtes où cette situation se produit, de sorte que nous n'avez pas à vous inquiéter à ce sujet.)Toutes les réponses ici sont probablement correctes, toutefois - si vous souhaitez manipuler l'algorithme de compression ZLib flux directement, et il a été produit en utilisant
gz_open, gzwrite, gzclose
fonctions - il y a ensuite supplémentaire de 10 octets en-tête de compression zlib de vapeur, - et celles qui sont produites par la fonction gz_open - d'en-tête ressemble à ceci:Et les résultats de vidage hexadécimal suivant:
1F 8B 08 00 00 00 00 00 00 0B
suivi par compression zlib flux.
Mais il y a aussi les de fuite 8 octets - ils sont
uLong
- crc sur l'ensemble du fichier,uLong
- taille de fichier non compressé - look pour la suite d'octets à la fin du flux: