2010-03-31 8 views
0

j'ai essayé de décompresser un fichier binaire à un membuf à partir d'une archive zip en utilisant Zip Lucian Wischik utils:EOF incorrect lors décompressé fichier binaire

http://www.wischik.com/lu/programmer/zip_utils.html

http://www.codeproject.com/KB/files/zip_utils.aspx

FindZipItem(hz, filename.c_str(), true, &j, &ze); 
char *content = new char[ze.unc_size]; 
UnzipItem(hz, j, content, ze.unc_size); 
delete[] content; 

Mais il n » ai pas t décompressez le fichier correctement. Il s'est arrêté au premier 0x00 du fichier. Par exemple quand je décompresse un fichier MP3 dans une archive ZIP, il ne décompresse que les 4 premiers octets: 0x49443303 (ID3 \ 0) car le 5ème au 8ème octet est 0x00.

J'ai également essayé de capturer le ZR_RESULT, et il retourne toujours ZR_OK (ce qui signifie terminé sans erreurs).

Je pense que ce gars-là avait aussi le même problème, mais personne ne répondit à sa question:

http://www.codeproject.com/KB/files/zip_utils.aspx?msg=2876222#xx2876222xx

Toute aide serait appréciée :)

Répondre

1

Il peut être décompresser très bien. Gardez à l'esprit que de nombreuses fonctions d'affichage de chaîne de caractères arrêteront de sortir des caractères au premier '\0'. Même votre débogueur affichera un char* comme s'il s'agissait d'une chaîne dans votre fenêtre de surveillance. Il ne peut que deviner ce que sont les données dans un tableau de caractères ... Comment testez-vous le nombre d'octets décompressés?

Vous voudrez peut-être essayer quelque chose comme ceci:

FindZipItem(hz, filename.c_str(), true, &j, &ze); 
char *content = new char[ze.unc_size]; 
memset(content, 0, ze.unc_size); // added so we can say that if it has a bunch of 0 bytes, then the unzip stopped early. 
UnzipItem(hz, j, content, ze.unc_size); 

// will print in hex all of the bytes in the array 
for(int i = 0; i < ze.unc_size; ++i) { 
    printf("%02x ", content[i]); 
} 

delete[] content; 
0

J'ai deux réponses. D'abord, si vous essayez de décompresser un fichier MP3. Vous avez tort. Les fichiers MP3 sont compressés, mais n'utilisent pas le format zip. Deuxièmement, comment savez-vous que la bibliothèque ne fait que dézipper les 4 premiers octets? Essayez-vous de printf() le contenu? Ou à strcpy() il? Dans ce cas, le comportement est normal, car ces fonctions sont censées traiter du texte, qui est défini comme tout-jusqu'à-le-premier-char-0.

+0

Je veux dire un fichier MP3 dans une archive ZIP :) et non seulement MP3, d'autres types de fichiers binaires, ainsi que des images, et je sais que seulement décompresser les 4 premiers octets (parce que les 4 octets suivants sont 0x00), est en le déboguant, et voir la valeur du tampon lorsque la commande unzip se termine. (J'utilise VC++ 2008 Express) –

Questions connexes