Question

Je crée quelque chose qui comprend un service de téléchargement de fichiers de toutes sortes, et je dois stocker des données compressées avec la fonction de compression () de zlib. Je l'envoie à travers l'Internet déjà comprimé, mais je dois connaître la taille de fichier non compressé sur le serveur distant. Est-il possible que je peux comprendre cette information sans uncompress () uant les données sur le serveur d'abord, juste pour l'efficacité? Voilà comment je le fais maintenant, mais s'il y a un raccourci j'aimerais prendre.

Par ailleurs, pourquoi est-il appelé Décompresser? Cela semble assez terrible pour moi, je toujours pensé que ce serait ... décomprimer

Était-ce utile?

La solution

Le format zlib ne dispose pas d'un champ pour la taille d'entrée d'origine, donc je doute que vous serez en mesure de le faire sans simuler une décompression des données. le format gzip a une "taille d'entrée" (ISIZE) champ, que vous pouvez utiliser, mais peut-être que vous voulez éviter de changer le format de compression ou d'avoir les clients d'envoyer la taille du fichier.

Mais même si vous utilisez un format différent, si vous ne faites pas confiance aux clients que vous auriez encore besoin d'exécuter un contrôle plus cher pour vous assurer que les données non compressées est la taille du client dit qu'il est. Dans ce cas, ce que vous pouvez faire est de décompressez-to / dev / null processus moins coûteux, ce qui zlib vous ne pas écrire les données de sortie nulle part, comme vous voulez juste savoir la taille non compressée.

Autres conseils

Je doute. Je ne crois pas que ce soit quelque chose que les bibliothèques zlib sous-jacentes fournissent de la mémoire (même si ça a été un bon 7 ou 8 ans que je l'ai utilisé, la documentation mise à jour ne semblent pas indiquer cette fonctionnalité a été ajoutée).

Une possibilité serait de transférer un autre fichier contenant la taille non compressée (par exemple, transférer à la fois file.zip et file.zip.size), mais qui semble plein de dangers, surtout si vous avez la mauvaise taille.

Une autre alternative est, si le serveur est temps décompresser cher, mais ne doit pas être fait immédiatement, de le faire dans une tâche de fond de faible priorité (comme avec nice sous Linux). Mais encore une fois, il peut y avoir des inconvénients si le vérificateur de taille commence à courir derrière (trop nombreux ajouts venant).

Et je tends à penser à la décompression en termes de « décompression explosive », pas un bon terme à utiliser: -)

Si vous téléchargez en utilisant le format « compress » cru, vous ne pourrez pas avoir des informations sur la taille des données qui est en cours de téléchargement. Pax est correct à cet égard.
Vous pouvez l'enregistrer comme un en-tête de 4 octets au début du tampon de compression -. En supposant que la taille du fichier ne dépasse pas 4 Go
du code C, par exemple:

 uint8_t *compressBuffer = calloc(bufsize + sizeof (uLongf), 0);
 uLongf compressedSize = bufsize;
 *((uLongf *)compressBuffer) = filesize;
 compress(compressBuffer + sizeof (uLongf), &compressedSize, sourceBuffer, bufsize);

Ensuite, vous envoyez le compressBuffer complet de la taille de compressedSize + (uLongf). Lorsque vous recevez sur le côté du serveur, vous pouvez utiliser le code suivant pour récupérer les données:

 // data is in compressBuffer, assume you already know compressed size.
 uLongf originalSize = *((uLongf *)compressBuffer);
 uint8_t *realCompressBuffer = compressBuffer + sizeof (uLongf);

Si vous ne faites pas confiance au client d'envoyer la bonne taille, vous devrez effectuer une sorte de vérification de données non compressées sur la taille du serveur. La suggestion d'utiliser Décompresser / dev / null est raisonnable.
Si vous téléchargez un fichier .zip, il contient un répertoire qui vous indique la taille du fichier quand il est non compressé. Cette information est intégrée dans le format de fichier, encore une fois, bien que ce soit sujet à des clients malveillants.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top