Comment vérifier si un fichier est compressé par gzip?
J'ai un programme C / C++ qui doit être lu dans un fichier qui peut ou non être compressé par gzip. Je sais que nous pouvons utiliser gzread () de zlib pour lire dans les fichiers compressés et non compressés-cependant, je veux utiliser les fonctions zlib uniquement si le fichier est compressé par gzip (pour des raisons de performance).
Est-il donc possible de détecter ou de vérifier par programmation si un certain fichier est gzippé à partir de C / C++?
4 réponses
Il y a un nombre magique au début du fichier. Il suffit de lire les deux premiers octets et de vérifier s'ils sont égaux à 0x1f8b
.
Préférez-vous les faux positifs, les faux négatifs ou pas de faux résultats du tout (il y a des performances dans le drain...)?
La RFC 1952: gzip file format specification version 4.3 indique que les 2 premiers octets (de chaque membre et donc) du fichier sont '\x1F'
et '\x8B'
. Utiliser que pour une première vérification qui peut entraîner des faux positifs.
Quelle est la différence de performance entre la lecture de fichiers compressés et non compressés à l'aide de gzread ()?
, de toute façon, afin de détecter si un fichier est au format gzip, vous pouvez lire la nombre magique au début du fichier, qui est 1f 8b
selon le lien.
Vous pouvez tester les signatures décrites dans les RFC 1951 et 1952 pour avoir une idée. Pour les fichiers GZIP, le second est pertinent et définitif. Il y a quelques faux positifs sur d'autres formats, donc vous devriez vérifier autant de l'en-tête pour les valeurs plausibles.
Pour les flux zlib, c'est un peu plus difficile, car ils sont encore plus sujets aux faux positifs. Mais vous rencontreriez rarement ceux dans la nature sur leur propre.