2013-10-11 5 views
0

J'ai du mal à gonfler un simple fichier HTML en utilisant zlib qui a été compressé en utilisant gzip.zlib gonfle l'erreur de données

Le fichier ci-dessous avec les étapes que je suis en train de faire pour l'ouvrir ainsi que la fonction de gonflage que j'essaie d'utiliser. Lorsque j'exécute la fonction, j'obtiens le code d'erreur Zlib Z_DATA_ERROR. D'après ce que je peux dire, je suis resté fidèle à l'exemple d'utilisation de zlib (trouvé here) mais j'ai quand même des problèmes. Le sous-programme de gonflage n'indique pas d'erreur avant que la méthode inflate() ne soit appelée et que la fonction retourne dans l'instruction switch, mais je n'ai pas pu déterminer quel était le problème.

Toute aide ici serait grandement appréciée.

fichier compressé:

<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>TEST</title> 
</head> 

<body> 
<ul> 
    <li>hello</li> 
    <li>I</li> 
    <li>am</li> 
    <li>a</li> 
    <li>test</li> 
    <li>web</li> 
    <li>page</li> 
</ul> 
</body> 
</html> 

Note: Ce sont le contenu du fichier avant la compression gzip.

Ouverture de fichier: Le fichier source est ensuite transmis dans inf().

FILE *sourcefile; 
sourcefile = fopen("/Users/me/pathtofile/test.html.gz", "r"); 

Gonfler routine:

inf(FILE *source, FILE *dest){ 

int chunk = 16384; 

//setup zlib variables 
int return_val; 
unsigned have; 
z_stream z_strm; 
unsigned char in[chunk]; 
unsigned char out[chunk]; 

//allocate inflate state 
z_strm.zalloc = Z_NULL; 
z_strm.zfree = Z_NULL; 
z_strm.opaque = Z_NULL; 
z_strm.avail_in = 0; 
z_strm.next_in = Z_NULL; 

return_val = inflateInit(&z_strm); 
if(return_val != Z_OK){ 
    return return_val; 
} 

cout << "zlib setup complete" << endl; 

//decompress 
do{ 
    z_strm.avail_in = fread(in, 1, chunk, source); 

    //check for error 
    if (ferror(source)){ 
     (void)inflateEnd(&z_strm); 
     return Z_ERRNO; 
    } 

    if(z_strm.avail_in == 0){ 
     break; 
    } 
    z_strm.next_in = in; 

    cout << "inflate loop") << endl; 

    //inflate the data 
    do{ 
     z_strm.avail_out = chunk; 
     z_strm.next_out = out; 

     return_val = inflate(&z_strm, Z_NO_FLUSH); 
     assert(return_val != Z_STREAM_ERROR); 

     cout << "switch statement start" << endl; 

     switch(return_val){ 
      case Z_NEED_DICT: 
       return_val = Z_DATA_ERROR; 
       cout << "case: Z_NEED_DICT" << endl; 
      case Z_DATA_ERROR: 
       cout<< "case: Z_DATA_ERROR" << endl; 
      case Z_MEM_ERROR: 
       cout << "case: Z_MEM_ERROR" << endl; 
       void(inflateEnd(&z_strm)); 
       return return_val; 
     } 

     cout << "switch statement end" << endl; 

     have = chunk - z_strm.avail_out; 

     if(fwrite(out, 1, have, dest) != have || ferror(dest)){ 
      (void)inflateEnd(&z_strm); 
      return Z_ERRNO; 
     } 

    }while(z_strm.avail_out == 0); 

}while(return_val != Z_STREAM_END); 
} 

Répondre

1

Vous devez utiliser inflateInit2() au lieu de inflateInit() pour demander le décodage du format gzip. zlib recherche par défaut le format zlib.

0

La principale raison pourrait être que vous avez mal initialisation inflateInit2(&z_strm,15+32) et gonflent inflate(&z_strm, Z_SYNC_FLUSH); pourrait résoudre votre problème.