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 Discussion :

decompression gzip avec zlib


Sujet :

C

  1. #1
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut decompression gzip avec zlib
    Bonjour tout le monde.
    je me trouve avec un probleme etrange. jai un fichier r.gzip que j'ai obtenue apres telechargement d'une page html compressee.
    je peux bien ouvrire le fichier gzip avec mon archive manager habituel mais
    quand il s'agit de decompresser avec mon code depuis un buffer j'ai l'erreur Z_DATA_ERROR.
    je me demande meme si zlib me permet de decompresser le gzip.
    voici le code pour obtenir le gzip en buffeur que j'enregistre dans un fichier r.gzip (pour tester que l'archive manageur l'ouvre bien et c'est le cas) et appres je tente la decompression:
    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
    37
    38
    39
    40
    41
    42
    int main(int argc,char **argv)
    {
     
        tnREQT_G *opt=tn_initGetReqt();
        tnRESP *resp=NULL;
     
        opt->user_a=malloc(10);
        if(opt->user_a==NULL)
        {
            fprintf(stderr,"plooooouuuf on te refuse de la memoire, allez oust!\n");
            return EXIT_FAILURE;
        }
        sprintf(opt->user_a,"mycrawler");
     
        resp=tn_httpget(argv[1],opt); 
        tn_releaseREQT(&opt);
     
        if(resp==NULL)
            return EXIT_FAILURE;
     
        fprintf(stdout,"http status:%d\ncontent size:%ld\n",resp->status,resp->cnt_size);
        if(resp->cnt_enc==NULL || cgfind(resp->cnt_enc,"gzip",0)<0)
            fprintf(stdout,"***content***\n%s**********************",resp->content);
        else
        {
            FILE *f=fopen("r.gz","wb");
            if(f==NULL)
            {
                fprintf(stderr,"file open error\n");
                return EXIT_FAILURE;
            }
            fwrite(&(resp->content),resp->cnt_size,1,f);
            fclose(f);
     
            ungzip(&(resp->content),resp->cnt_size,'t');
            //fprintf(stderr,"content :%s",resp->cnt_enc);
            //fprintf(stderr,"content size:%s,%ld",resp->cnt_enc,resp->cnt_size);                                                                                                                              
        }
     
        tn_releaseRESP(&resp);
        return EXIT_SUCCESS;
    }
    donc jusqu'a ungzip() tout se passe bien, si la page telecharcher est html non compresse elle s'affiche nikel. mais quand je rentre dans la fonction gzip, j'ai l'erreur. voici la fonction
    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
    size_t ungzip(char **datas,size_t s_gzip,char t)
    {
        char *data=*datas;
        size_t s_data=2*s_gzip;
        char *res=NULL;
        int val,i;
     
        if(s_gzip>=4294967296L) //pour l'instant on gere pas les fichiers de 4G
            return 0;
     
        s_data=(unsigned int)((((unsigned char)data[s_gzip-1])<<24)|(((unsigned char)data[s_gzip-2])<<16)|(((unsigned char)data[s_gzip-3])<<8)|(((unsigned char)data[s_gzip-4])));
        if(s_data>=4294967296L) //pour l'instant on gere pas les fichiers de 4G
            return 0;
     
     
        if(t=='t') //si le contenue doit etre mis dans une chaine de caracteres                                                                                                                                
            res=malloc(sizeof(char)*s_data+1);
        else
            res=malloc(sizeof(char)*s_data);
     
        if(res==NULL)
        {
            fprintf(stderr,"allocation error in %s %d\n",__func__,__LINE__);
            exit(1);
        }
        val=uncompress(res,&s_data,data,s_gzip);
        fprintf(stderr,"%d ,ok:%d,data:%d,buff:%d,mem:%d\n",val,Z_OK,Z_DATA_ERROR,Z_BUF_ERROR,Z_MEM_ERROR);
     
        free(data);
     
        if(t=='t')
            res[s_data]=0;
        *datas=res;
     
        return s_data;
    }
    puis je teste sur un site dont je suis sur de recevoir un contenu compresse:
    RT='t'
    RT='x'
    http status:200
    content size:13386
    -3 ,ok:0,data:-3,buff:-5,mem:-4
    le premier -3 montre que la fonction uncompress me renvois Z_DATA_ERROR(-3).
    pourtant une verification du fichier r.gz me dit que tout est en ordre.
    j'ai ecrit un petit prog pour comparer octet par octet le fichier r.gz et mon buffer res->content et ils sont identique.
    je suis bloque je comprend pas pourquoi j'ai une erreure -3
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  2. #2
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Points : 306
    Points
    306
    Par défaut
    Salut,

    peux-tu préciser comment tu utilises les fonctions de la Zlib pour décompresser ton archive gzip? En effet, de base, cette lib n'est pas directement faite pour gzip mais l'algorithme inflate reste le même. Il faut soit passer par les fonctions dédiées (http://www.zlib.net/manual.html#Gzip), soit initialiser la décompression avec inflateInit2 de façon adaptée à ton archive, via le paramètre windowBits:

    windowBits can also be greater than 15 for optional gzip decoding. Add 32 to windowBits to enable zlib and gzip decoding with automatic header detection, or add 16 to decode only the gzip format (the zlib format will return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a crc32 instead of an adler32.

  3. #3
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val=uncompress(res,&s_data,data,s_gzip);
    avec ress=destination
    data=source

    donc je dois d'apres ce que tu dis initialiser avant?
    je vais jetter un coup d'oeil sur le lien. merci, je feedback desque desque
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Points : 306
    Points
    306
    Par défaut
    La fonction uncompress est une "utility function" dont la doc dit:

    The following utility functions are implemented on top of the basic stream-oriented functions. To simplify the interface, some default options are assumed (compression level and memory usage, standard memory allocation functions). The source code of these utility functions can easily be modified if you need special options.
    Donc si les paramètres par défaut ne correspondent pas à ce dont tu as besoin, la lib va considérer que tes données sont incorrectes.

    En général, avec Zlib, il faut ouvrir le fichier, initialiser l'algorithme de décompression, décompresser jusqu'au bout du flux et terminer la décompression. Tout est bien expliqué sur l'exemple du site officiel : http://zlib.net/zlib_how.html

  5. #5
    Membre expérimenté Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2011
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2011
    Messages : 623
    Points : 1 554
    Points
    1 554
    Par défaut
    Hello,

    J'ai trouvé ceci: http://www.lemoda.net/c/zlib-open-read/index.html, j'espère que cela t'aidera.
    On écrit "J'ai tort" ; "tord" est la conjugaison du verbre "tordre" à la 3ème personne de l'indicatif présent

  6. #6
    Membre chevronné
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Points : 1 944
    Points
    1 944
    Par défaut
    Merci a vous deux. le probleme est resolut.

    enfin, ca marche a moitie mais j'ai au moins un apercu.
    Petit lien vers mon premier jeux SDL2/C
    http://store.steampowered.com/app/72..._Soul_Of_Mask/
    la suite? ca vient,ca vient!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problemes de decompression avec zlib (gzip)
    Par muquet dans le forum C
    Réponses: 3
    Dernier message: 25/07/2007, 13h57
  2. Problème avec zlib.dll
    Par alex_95 dans le forum Général VBA
    Réponses: 2
    Dernier message: 25/07/2006, 14h33
  3. Réponses: 2
    Dernier message: 13/01/2006, 10h11
  4. Réponses: 4
    Dernier message: 03/08/2005, 09h47
  5. 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