IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Decompression gzip c++


Sujet :

C++Builder

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Par défaut Decompression gzip c++
    Bonsoir.
    J'essaye de décompresser la réponse d'un serveur qui est compressée en gzip,
    J'utilise la bibliothèque IdZLib, A première vue c'est tout simple,
    Voila mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //(...)
    TStringStream * C_Resp, *D_Resp;
     
    C_Resp = new TStringStream();
    D_Resp = new TStringStream();
    IdHttp->Get("http://www.site.com",C_Resp);
    DecompressStream(C_Resp,D_Resp);        //access violation at 0x00000038
    Je bug ! Si quelqu'un peux m'éclairer...Merci

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 048
    Par défaut
    Cher Van Hohenheim, cela m'étonne tu utilises DecompressStream comme une simple procédure ! N'est ce pas normalement une méthode de TIdCompressorZLib ?

    essaye
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    IdHttp->Get("http://www.site.com",C_Resp);
    C_Resp->Seek(0, soBeginning); // "rembobine" le stream
    DecompressStream(C_Resp,D_Resp);
    Essaye IndyDecompressStream ou utilise des TMemoryStream, si cela ne convient toujours pas !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Par défaut
    Merci pour ta reponse Shaï, J'ai essayé ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TMemoryStream * C_Resp, *D_Resp;
    C_Resp = new TMemoryStream();
    D_Resp = new TMemoryStream();
    C_Resp->Seek(0, int(soBeginning));
     
    IdHttp->Request->AcceptEncoding	="gzip,deflate";
    IdHttp->Get("http://www.site.com",C_Resp);
     
    IndyDecompressStream(C_Resp,D_Resp,32);
    Le message d'erreur maintenant c'est "EDecompressionError ZLib Error (-6) "
    C'est a dévorer son clavier!

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 048
    Par défaut
    Tu as mis le seek trop tôt !
    Le Seek c'est pour revenir en arrière après le Get
    Le Get écrit dans le Stream, il faut le voir comme une Bande, il faut revenir en arrière pour relire !

    AcceptEncoding "gzip,deflate" aurait-il un effet particulier, il ne dezippe pas implictement ?
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Par défaut
    J'ai mis le Seek après la reception, c'est pareil.
    le stream de la réponse est compressé car quand je fait SavetoFile le fichier que j'obtiens est compressé. je peux l'ouvrir avec winrar pour voir le contenu html.

    Si je ne fais pas "gzip,deflate" je reçois la page html en clair et ça use trop de bande passante, le seul moyen que j'ai trouvé pour en utiliser un minimum c'est construire moi même les headers de requete, sans l'option "gzip" puis recevoir le html jusqu'a ce que j'atteigne la balise que je cherche, puis je fais un Socket->Disconnect();
    Ca m'evite de telecharger toute la page alors que la valeur que je cherche se trouve vers le milieu.
    Si tu connais une autre solution je suis preneur.

  6. #6
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Par défaut
    Après une journée entière de recherches infructueuses il me semble que le problème viens de la bibliothèque elle même, Je jette l’éponge je laisse mon application tourner comme ça. Merci pour l'attention Shai

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 7
    Par défaut
    J'ai trouvé une solution pour décompresser les donnés "gzip" reçues du serveur.
    J'ai utilisé la fonction deflate. voici le l'essentiel du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    TStringStream * C_Resp, *D_Resp;
     
    unsigned char *GzipBuff ;
    unsigned char *UnzipBuff = (unsigned char*)malloc(100000);
     
    C_Resp = new TStringStream();
    D_Resp = new TStringStream();
    unsigned int SrcLen,DestLen;
     
    Form1->IdHttp->Request->AcceptEncoding	="gzip,deflate";
    Form1->IdHttp->Get("http://fr2.darkorbit.bigpoint.com",C_Resp);
     
    SrcLen=C_Resp->Size;
    GzipBuff = (unsigned char*)malloc(100000);
     
    Zlib::z_stream strm;
    	strm.zalloc = Z_NULL;
    	strm.zfree = Z_NULL;
    	strm.opaque = Z_NULL;
    	strm.avail_in = 0;
    	strm.next_in = Z_NULL;
     
    int ret =inflateInit2(strm,16);
     
    C_Resp->Seek(0, int(soBeginning));
    C_Resp->Read(GzipBuff,SrcLen);
     
    strm.avail_in = SrcLen;
    strm.next_in = GzipBuff;
    strm.avail_out = 100000; // taille max supposée du buffer décompressé.
    strm.next_out = UnzipBuff;
     
    inflate(strm,Z_NO_FLUSH);
    DestLen=strm.total_out;
    D_Resp->Write(Unzip,DestLen)

Discussions similaires

  1. decompression gzip avec zlib
    Par lilington dans le forum Débuter
    Réponses: 5
    Dernier message: 12/08/2013, 04h01
  2. compression / decompression gzip
    Par lostsoul dans le forum Débuter
    Réponses: 8
    Dernier message: 26/01/2011, 02h13
  3. Webservice et decompression Gzip VB.NET Framework 2.0
    Par pierre.ricci dans le forum Services Web
    Réponses: 4
    Dernier message: 21/09/2007, 14h12
  4. decompression gzip
    Par ma2th dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 11/05/2004, 13h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo