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);
}