COMPRESSION BZ2 (MIEUX QUE ZLIB) EN C.

victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 - 24 août 2004 à 21:07
bileltechno Messages postés 3 Date d'inscription vendredi 28 juin 2013 Statut Membre Dernière intervention 4 mars 2015 - 4 mars 2015 à 12:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/20796-compression-bz2-mieux-que-zlib-en-c

bileltechno Messages postés 3 Date d'inscription vendredi 28 juin 2013 Statut Membre Dernière intervention 4 mars 2015
4 mars 2015 à 12:23
Bonjour, j'ai toujours cet erreur :
" 1>Stat_test.obj : error LNK2019: symbole externe non résolu _BZ2_bzWrite@16 référencé dans la fonction "public: int __thiscall CStat_test::compress_to_file(char *,char *,int)" (?compress_to_file@CStat_test@@QAEHPAD0H@Z) "
---------------------------
pouvez vous m'aidez? et merci d'avance :)
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
10 mars 2008 à 19:14
Il faut que tu créé un format d'assemblage de fichier et qu'au lieu de l'écrire avec la fonction write que tu utilise celle du BZ2.
Ca revient à créer un assembleur de fichier avec juste la fonction de lecture et d'écriture qui diffère.
SuperMonkey Messages postés 3 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 10 mars 2008
10 mars 2008 à 17:05
Pas mal du tout !
Cependant j'ai une question :

Est il possible de compresser plusieurs fichiers en un
en améliorant ton code ?
rosemarie302 Messages postés 3 Date d'inscription lundi 9 février 2004 Statut Membre Dernière intervention 15 novembre 2004
2 mai 2007 à 22:28
bonjour,

Alors voici les corrections a apporter pour que le code soit correcte :
il faut remplacer tous les "int in, out;" par "unsigned int in, out;" .
et changer les options d'ouverture de fichier "r" et "w" en mode binaire par "rb" et "wb" dans toutes les fonctions.
Dans la fonction compress_to_file, remplacer "if(bzerr=BZ_IO_ERROR)" par " if(bzerr==BZ_IO_ERROR)" .

et voilla le code est parfait, je rapel que pour l'utiliser sous DEV-C++ il suffi d'installer le DEV-PACK "bzip2" et de linker l'option -lbz2 dans le projet et de trouver sur son ordi la DLL "bzip2.dll" pour accompagner le programme, voillou !!

Pour une utilisation en annex il faut cree le fichier "bzcompress.h" a inclure dans votre programme main.

/* bzcompress.h par 302 ~ joie ludovic ~ 2007 */
int compress_file_to_file(char *fin, char *fout);
int compress_to_file(char *file, char *data, int len);
void * uncompress_from_file(char *filename, int block_size, int *size);
int uncompress_from_file_to_file(char *fin, char *fout, int block_size);
/* */

et pour les rapides voici une fonction test :

#include "bzcompress.h"
et
char source[512];
char compresser[512];
char decompresser[512];

sprintf(source,"image.bmp");
sprintf(compresser,"image compresser.bmp.bz");
sprintf(decompresser,"image decompresser.bmp");

compress_file_to_file(source,compresser);
uncompress_from_file_to_file(compresser,decompresser,0);
/**/

Oki j'espere faciliter la tache a pas mal de monde.
Bonne compression a tous.


/* 302 ~ joie ludovic ~ 2007 */
/* slyders302@hotmail.com */
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
17 avril 2007 à 00:40
Comment on récupère la taille du fichier non compressé dans une archive compressée ?
cs_rwick Messages postés 1 Date d'inscription mardi 15 juillet 2003 Statut Membre Dernière intervention 27 octobre 2006
27 oct. 2006 à 17:35
Pour ceux qui comme moi on des problèmes de vue sur ce source,
je veux signaler qu'il y a petit problème dans la fonction compress_to_file.
Il ne faut pas lire :
if(bzerr=BZ_IO_ERROR)
{
BZ2_bzWriteClose(&bzerr,bh,1,&in,&out);
fclose(fd);
return -1;
}
mais
if(bzerr==BZ_IO_ERROR)
{
BZ2_bzWriteClose(&bzerr,bh,1,&in,&out);
fclose(fd);
return -1;
}
cs_rascas Messages postés 3 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 9 mai 2006
9 mai 2006 à 10:51
non je veux dire sur kdevelop desolé pas kwrite (la honte)
cs_rascas Messages postés 3 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 9 mai 2006
9 mai 2006 à 10:49
je croi qu elle est deja instaler car quand je compile le source seul avec un editeur de texte ca marche bien, mais toujour sur kwrite ca marche pas!!
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
4 mai 2006 à 17:33
Il faut télécharger et installer la librairie bz2 !
cs_rascas Messages postés 3 Date d'inscription jeudi 27 janvier 2005 Statut Membre Dernière intervention 9 mai 2006
4 mai 2006 à 17:29
j ai essayé d utiliser le code avec kdevelop mais ca donne des erreur de type
/home/tannicha/appessai/src/appessai.cpp:334: undefined reference to `BZ2_bzWriteOpen'
/home/tannicha/appessai/src/appessai.cpp:340: undefined reference to `BZ2_bzWriteClose'
que dois je faire??merci
progrima Messages postés 125 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 4 janvier 2006
11 oct. 2005 à 02:33
j'ai pris tes deux fonctions de compressions file to file et décompression file to file, et je les ai intégré dans mon prog.
Le prob c'est que la fonction de compression me donne tjrs une taille supperieur pour le fichier compressé.
stp, est ce que tu peux m'aider?
progrima Messages postés 125 Date d'inscription lundi 1 novembre 2004 Statut Membre Dernière intervention 4 janvier 2006
10 oct. 2005 à 23:05
j'ai essayé de compiler ca avec visual C++ 6.0, mais j'ai eu l'erreur : Cannot open include file: 'bzlib.h': No such file or directory.

que dois je faire??
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
25 août 2004 à 17:28
oui...et meme .bz2 pour etre precis!!
en general il est associe a tar, qui permetr de faire une archive (la bzlib ne fait que compresser), ce qui donne des archives .tar.bz2 qui tendent a remplacer les archives .tar.gz ;-)
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
25 août 2004 à 17:26
Il me semble que ce format est .bz.
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
25 août 2004 à 15:01
Et oui c est bien les logiciels libres!
Ce format est en effet tres performant, et il tend a remplacer le format .gz sous Unix (.gz --> Zlib).
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
24 août 2004 à 22:18
Plus inprésionant un fichier de vide créé par Windows de taille 100Mo en 23 secondes devient du 113octets et en 6 Sec le 113octes redevient du 100Mo !!!!

Allucinant non ?

Si vous me croyez pas je vous envoi la preuve (en .bz evidement!!)

Et d'après mes test sur tout les compressions celle là est un bon compromis entre vitesse et compression (je ne dirait pas que la compression est sans aucune perte).

Même les format .rar et .zip compresse moins bien (testé seulement avec une bitmap)

Voilà c'était mon petit rapport
victorcoasne Messages postés 1101 Date d'inscription jeudi 24 avril 2003 Statut Membre Dernière intervention 23 juillet 2023 7
24 août 2004 à 21:07
Nickel et pour Windows sous Dev-C++ ça fonctionne en modifiant 2~3 p'tit choses !!

Un exemple de compression sur une image bitmap de 2.25 Mo j'obtient 327ko pas mal non ?


10/10 !!
Rejoignez-nous