2010-08-13 18 views
1

Je voudrais savoir comment déterminer combien de fichiers zlib sont contenus dans un seul fichier.Comment puis-je trouver le nombre de fichiers zlib dans un seul fichier zlib?

Un exemple; Pensez que j'ai 5 fichiers différents, et compressés séparément en utilisant zlib. Ensuite, je les ai combinés. Donc, j'ai un fichier contient 5 fichiers zlib différents. Maintenant, comment puis-je trouver combien de fichiers zlib sont dans ce fichier unique? J'ai juste besoin de trouver le nombre de fichiers zlib dans un seul fichier. Je devine, j'ai besoin de vider son code hexadécimal et grep un nombre magique, mais je ne pouvais pas comprendre comment faire cela.

Pourriez-vous m'aider?

Répondre

2

La longueur d'un bloc n'est pas stockée dans les données codées zlib (à l'exception de non-compressed block). Au lieu de cela, la fin d'un bloc est signalée par un jeton [256] dans le flux. Mais ce jeton est codé par Huffman et le codage Huffman est généralement dynamically generated donc il peut être différent pour chaque bloc. De plus, le jeton codé peut commencer sur n'importe quel bit de l'octet, donc il n'y a aucun moyen de le "grep". La seule façon de trouver le jeton de fin de bloc est de décoder le bloc entier et de vérifier quand vous frappez ce jeton.

Je pense plutôt que vous devriez voir si votre conteneur contient des informations de longueur et l'utiliser pour savoir combien de temps les données compressées sont.

Pour plus de détails sur le format zlib, voir RFC 1950 et la spécification DEFLATE associée qui est RFC 1951.

+0

Oui, je sais. Laisses-moi le mettre comme ça; J'ai un conteneur qui a plusieurs fichiers zlib. Comment puis-je trouver combien de fichiers zlib se trouvent dans ce conteneur? – merinn

+0

@merinn: Quel "conteneur" utilisez-vous? Je pense que le format du conteneur est plus important que le format de zlib. –

+0

@merinn: Zlib ne compresse pas les fichiers - il compresse les données. Il n'y a pas de 'fichier zlib'. –

1

Si votre fichier unique est un concaténation de plusieurs fichiers gzip, vous pouvez trouver une limite supérieure pour le nombre de fichiers. Le format Gzip commence par la magie 0x1f8b.

Comptez l'occurrence de la magie dans le fichier unique. Le nombre indique que vous avez au maximum autant de fichiers. Malheureusement, c'est une limite supérieure et non un nombre exact de fichiers. Parce que 0x1f8b peut également se produire dans la section de données par hasard 1 sur 64K octets. Pour réduire les fausses correspondances à 1 dans ~ 24 millions d'octets, vous pouvez rechercher 0x1f8b08 à la place. Le 0x08 arrière est le champ "méthode de compression" qui est toujours 8.

D'autres améliorations de ce "filtre" sont possibles. Voir le champ FLG de RFC1952. Si les membres du fichier unique ne sont pas formatés au format gzip, mais au format Zlib ou raw, vous n'avez pas de chance; vous devez décompresser pour compter le nombre de fichiers - ce que je ferais indépendamment.