J'ai un problème avec la classe GZIP de la bibliothèque Crypto ++. Je travaille sur une application cliente de serveur. L'application cliente est écrite en C++. Je chiffrent les données à l'aide de la classe GZIP comme suit:Crypto ++ bibliothèque gzip issue
#include <gzip.h>
Gzip zipper(1); // 1 is fast, 9 is slow
zipper.Put(pData,dwLen);
zipper.Close();
byte* pCompressed = new byte[zipper.MaxRetrieveable()];
zipper.Get(pCompressed,zipper.MaxRetrieveable());
Les données sont hexadécimal codé, puis transféré à la PYTHON utiliser qui décode et tente de décompresser ces flux GZIP comme suit:
import gzip
import StringIO
fio = StringIO.StringIO(gzip_data)
f = gzip.GzipFile(fileobj=fio)
f.read()
'test'
f.close()
Et je ont également essayé ce qui suit comme:
fh = gzip.open('abc.gz', 'rb')
cdata = fh.read()
fh.close()
Cela semble assez simple, mais il ne fonctionne pas correctement et me donne des erreurs au cours du processus de décompression à l'extrémité PYTHON. Existe-t-il une manière distincte de décompresser les flux par rapport aux fichiers réels utilisant la classe de module PYTHON?
Si quelqu'un d'autre a eu ce problème, toute aide serait grandement appréciée.
MISE À JOUR
Merci pour votre réponse JWW. Juste Pour votre information, je suis arrivé que cela fonctionne aujourd'hui en décompressant le flux reçu, du logiciel C de l'utilisation de la bibliothèque cryptopp, comme suit dans le client PYTHON:
compressedstream = StringIO.StringIO(data2)
gzipper = gzip.GzipFile(fileobj=compressedstream)
f = gzipper.read()
Je ne sais pas exactement pourquoi cela fonctionne. Il semble que vous deviez traiter/décompresser les flux gzip et les fichiers gzip différemment. Dans tous les cas, la méthode de décompression de flux à l'aide de la méthode PYTHON gzip.GzipFile fonctionne très bien.
Je ne suis pas vraiment sûr où le problème réside. Vous pouvez essayer d'appeler 'zipper.Flush (true)'. Voir les commentaires autour de la ligne 840 de [fichier source cryptlib.h] (http://www.cryptopp.com/docs/ref/cryptlib_8h_source.html). De plus, les autres filtres n'ont généralement besoin que d'un appel à 'MessageEnd()' pour terminer le traitement d'un message. C'est-à-dire 'zipper.MessageEnd()'. Enfin, vous pouvez essayer de changer le niveau de dégonflement. – jww
Merci pour votre réponse jww. J'ai trouvé une solution et mis à jour mon commentaire pour les autres à voir au cas où ils ont ce problème. – user3238036
C'est génial que vous ayez trouvé une réponse et l'ai partagée. Vous devez déplacer le bloc Mettre à jour vers une réponse, puis accepter votre propre réponse. Sinon, cette question reste ouverte et semble n'avoir aucune réponse. Voir [Comment fonctionne l'acceptation d'une réponse?] (Https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). – jww