2014-06-19 3 views
1

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.

+0

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

+0

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

+0

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

Répondre

0

MISE À JOUR

Nous vous remercions pour votre JWW de réponse. 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.