Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COMPRESSION RLE (VC++ 5.0)


Information sur la source

Catégorie :Fichiers / Disque Niveau : Initié Date de création : 29/01/2002 Date de mise à jour : 29/01/2002 22:07:25 Vu / téléchargé: 3 892 / 165

Note :
5,5 / 10 - par 2 personnes
5,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (4)
Ajouter un commentaire et/ou une note

Description

c'est une compression tout ce qu'il y'as de plus facile !
le meme principe que la compression des pcx (format 8 bits) !
c'est excellent pour compressé certain fichier (ceux qui ont plein de byte pareil qui se suivent) et very bad pour d'autre !
la premiere partie (celle qui me sert a gerer ma fenetre windows) est pas du tout ansi mais il me semble que le reste l'est, mais je suis pas
 

Source

  • #include <windows.h>
  • #include <stdio.h>
  • #include "resource.h"
  • HWND hMain;
  • HICON hIcon;
  • HINSTANCE hInstance;
  • BOOL CALLBACK MainDlg(HWND,UINT,WPARAM,LPARAM);
  • int NbrCarCons(const unsigned char *Src,const int &Taille);
  • int RLE_Decompacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);
  • int RLE_Compacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);
  • // ET = Estime Taille
  • int RLE_Decompacte_ET(unsigned const char *Src,const int &TailleSrc);
  • int RLE_Compacte_ET(unsigned const char *Src,const int &TailleSrc);
  • bool CompacterFichier(const char *FichierDest,const char *FichierSrc,int methode);
  • bool DecompacterFichier(const char *FichierDest,const char *FichierSrc,int methode);
  • int WINAPI WinMain(HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil){
  • hInstance = hThisInstance;
  • hIcon = LoadIcon(hThisInstance,MAKEINTRESOURCE(IDI_ICON));
  • DialogBox(hThisInstance,MAKEINTRESOURCE(IDD_MAINDIALOG),NULL,(DLGPROC) MainDlg);
  • DestroyIcon(hIcon);
  • return true;
  • };
  • BOOL CALLBACK MainDlg(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
  • char Buf[512],Buf2[512];
  • switch(message){
  • case WM_COMMAND:
  • switch (LOWORD(wParam)){
  • case IDC_COMP:
  • GetDlgItemText(hwnd,IDC_FICHIER,Buf,512);
  • GetDlgItemText(hwnd,IDC_FICHIER2,Buf2,512);
  • CompacterFichier(Buf2,Buf,0);
  • break;
  • case IDC_DECOMP:
  • GetDlgItemText(hwnd,IDC_FICHIER,Buf,512);
  • GetDlgItemText(hwnd,IDC_FICHIER2,Buf2,512);
  • DecompacterFichier(Buf2,Buf,0);
  • break;
  • case IDC_FERMER:
  • SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,NULL);
  • break;
  • }
  • break;
  • case WM_INITDIALOG:
  • hMain = hwnd;
  • SendMessage(hwnd,WM_SETICON,ICON_BIG,(LPARAM) hIcon);
  • break;
  • case WM_CLOSE:
  • EndDialog(hwnd, TRUE);
  • return true;
  • break;
  • }
  • return false;
  • }
  • int NbrCarCons(const unsigned char *Src,const int &Taille){
  • int c,i;
  • if(Taille == 0) return 0;
  • c = *Src++;
  • for(i=1;i<Taille;i++)
  • if(c!=*Src++) break;
  • return i;
  • }
  • int RLE_Compacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest){
  • int i,i2=0,Nbr,reste;
  • unsigned char c;
  • for(i=0;i<TailleSrc;i++){
  • Nbr = NbrCarCons(Src,TailleSrc-i);
  • c = *Src++;
  • if(Nbr == 0) return 0;
  • if(Nbr == 1){
  • if(c>0xB0){
  • i2 += 2;
  • if(i2 > TailleDest) return 0;
  • *Dest = 0xB1;
  • Dest++;
  • *Dest = c;
  • Dest++;
  • }else{
  • if((++i2)> TailleDest) return 0;
  • *Dest = c;
  • Dest++;
  • }
  • }else{
  • if(Nbr>(0xFF-0xB0)){
  • reste = Nbr;
  • while(reste>(0xFF-0xB0)){
  • i2 += 2;
  • if(i2 > TailleDest) return 0;
  • *Dest = 0xFF;
  • Dest++;
  • *Dest = c;
  • Dest++;
  • reste -= (0xFF-0xB0);
  • }
  • if(reste>0){
  • i2 += 2;
  • if(i2 > TailleDest) return 0;
  • *Dest = 0xB0+reste;
  • Dest++;
  • *Dest = c;
  • Dest++;
  • }
  • }else{
  • i2 += 2;
  • if(i2 > TailleDest) return 0;
  • *Dest = 0xB0+Nbr;
  • Dest++;
  • *Dest = c;
  • Dest++;
  • }
  • Src += Nbr-1;
  • i += Nbr-1;
  • }
  • }
  • return i2;
  • }
  • int RLE_Decompacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest){
  • int i,i2=0,i3;
  • unsigned char c,c2=0;
  • for(i=0;i<TailleSrc;i++){
  • c = *Src++;
  • if(c2 == 0){
  • if(c>0xB0){c2 = c-0xB0;continue;}
  • if((++i2)>TailleDest) return 0;
  • *Dest = c;
  • Dest++;
  • }else{
  • for(i3=0;i3<c2;i3++){
  • if((++i2)>TailleDest) return 0;
  • *Dest = c;
  • Dest++;
  • }
  • c2 = 0;
  • }
  • }
  • return i2;
  • }
  • int RLE_Decompacte_ET(unsigned const char *Src,const int &TailleSrc){
  • int i,i2=0;
  • unsigned char c,c2=0;
  • for(i=0;i<TailleSrc;i++){
  • c = *Src++;
  • if(c2 == 0){
  • if(c>0xB0){c2 = c-0xB0;continue;}
  • i2++;
  • }else{
  • i2 += c2;
  • c2 = 0;
  • }
  • }
  • return i2;
  • }
  • int RLE_Compacte_ET(unsigned const char *Src,const int &TailleSrc){
  • int i,i2=0,Nbr,reste;
  • unsigned char c;
  • for(i=0;i<TailleSrc;i++){
  • Nbr = NbrCarCons(Src,TailleSrc-i);
  • c = *Src++;
  • if(Nbr == 0) return 0;
  • if(Nbr == 1){
  • if(c>0xB0) i2+=2;
  • else i2++;
  • }else{
  • if(Nbr>(0xFF-0xB0)){
  • reste = Nbr;
  • while(reste>(0xFF-0xB0)){
  • i2 += 2;
  • reste -= (0xFF-0xB0);
  • }
  • if(reste>0) i2 += 2;
  • }else{
  • i2 += 2;
  • }
  • Src += Nbr-1;
  • i += Nbr-1;
  • }
  • }
  • return i2;
  • }
  • bool CompacterFichier(const char *FichierDest,const char *FichierSrc,int methode){
  • FILE *Fichier;
  • unsigned char *ContenuSrc,*ContenuDest;
  • int TailleSrc,TailleDest;
  • if((Fichier = fopen(FichierSrc,"rb")) == NULL) return false;
  • fseek(Fichier,0,SEEK_END);
  • TailleSrc = ftell(Fichier);
  • fseek(Fichier,0,SEEK_SET);
  • ContenuSrc = (unsigned char*) malloc(TailleSrc);
  • fread(ContenuSrc,1,TailleSrc,Fichier);
  • fclose(Fichier);
  • TailleDest = RLE_Compacte_ET(ContenuSrc,TailleSrc);
  • ContenuDest = (unsigned char*) malloc(TailleDest);
  • TailleDest = RLE_Compacte(ContenuDest,ContenuSrc,TailleSrc,TailleDest);
  • free(ContenuSrc);
  • if((Fichier = fopen(FichierDest,"w")) == NULL){
  • free(ContenuDest);
  • return false;
  • }
  • fwrite(ContenuDest,1,TailleDest,Fichier);
  • fclose(Fichier);
  • free(ContenuDest);
  • return true;
  • }
  • bool DecompacterFichier(const char *FichierDest,const char *FichierSrc,int methode){
  • FILE *Fichier;
  • unsigned char *ContenuSrc,*ContenuDest;
  • int TailleSrc,TailleDest;
  • if((Fichier = fopen(FichierSrc,"rb")) == NULL) return false;
  • fseek(Fichier,0,SEEK_END);
  • TailleSrc = ftell(Fichier);
  • fseek(Fichier,0,SEEK_SET);
  • ContenuSrc = (unsigned char*) malloc(TailleSrc);
  • fread(ContenuSrc,1,TailleSrc,Fichier);
  • fclose(Fichier);
  • TailleDest = RLE_Decompacte_ET(ContenuSrc,TailleSrc);
  • ContenuDest = (unsigned char*) malloc(TailleDest);
  • TailleDest = RLE_Decompacte(ContenuDest,ContenuSrc,TailleSrc,TailleDest);
  • free(ContenuSrc);
  • if((Fichier = fopen(FichierDest,"w")) == NULL){
  • free(ContenuDest);
  • return false;
  • }
  • fwrite(ContenuDest,1,TailleDest,Fichier);
  • fclose(Fichier);
  • free(ContenuDest);
  • return true;
  • }
#include <windows.h>
#include <stdio.h>
#include "resource.h"

HWND		hMain;
HICON		hIcon;
HINSTANCE	hInstance;

BOOL CALLBACK MainDlg(HWND,UINT,WPARAM,LPARAM);

int NbrCarCons(const unsigned char *Src,const int &Taille);
int RLE_Decompacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);
int RLE_Compacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);
// ET = Estime Taille
int RLE_Decompacte_ET(unsigned const char *Src,const int &TailleSrc);
int RLE_Compacte_ET(unsigned const char *Src,const int &TailleSrc);

bool CompacterFichier(const char *FichierDest,const char *FichierSrc,int methode);
bool DecompacterFichier(const char *FichierDest,const char *FichierSrc,int methode);

int WINAPI WinMain(HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil){
	hInstance = hThisInstance;
	hIcon = LoadIcon(hThisInstance,MAKEINTRESOURCE(IDI_ICON));
	DialogBox(hThisInstance,MAKEINTRESOURCE(IDD_MAINDIALOG),NULL,(DLGPROC) MainDlg);
	DestroyIcon(hIcon);
	return true;
};

BOOL CALLBACK MainDlg(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
	char	Buf[512],Buf2[512];
	
	switch(message){
		case WM_COMMAND:
			switch (LOWORD(wParam)){
				case IDC_COMP:
					GetDlgItemText(hwnd,IDC_FICHIER,Buf,512);
					GetDlgItemText(hwnd,IDC_FICHIER2,Buf2,512);
					CompacterFichier(Buf2,Buf,0);
				break;
				case IDC_DECOMP:
					GetDlgItemText(hwnd,IDC_FICHIER,Buf,512);
					GetDlgItemText(hwnd,IDC_FICHIER2,Buf2,512);
					DecompacterFichier(Buf2,Buf,0);
				break;
				case IDC_FERMER:
					SendMessage(hwnd,WM_SYSCOMMAND,SC_CLOSE,NULL);
				break;
			}
		break;

		case WM_INITDIALOG:
			hMain = hwnd;
			SendMessage(hwnd,WM_SETICON,ICON_BIG,(LPARAM) hIcon);
        break;

		case WM_CLOSE:
			EndDialog(hwnd, TRUE);
			return true;
		break;
    }
    return false;
}


int NbrCarCons(const unsigned char *Src,const int &Taille){
	int c,i;
	if(Taille == 0) return 0;
	c = *Src++;

	for(i=1;i<Taille;i++)
		if(c!=*Src++) break;
	
	return i;
}


int RLE_Compacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest){
	int i,i2=0,Nbr,reste;
	unsigned char c;
	
	for(i=0;i<TailleSrc;i++){
		Nbr = NbrCarCons(Src,TailleSrc-i);
		c = *Src++;
		if(Nbr == 0) return 0;
		if(Nbr == 1){
			if(c>0xB0){
				i2 += 2;
				if(i2 > TailleDest) return 0;
				*Dest = 0xB1;
				Dest++;
				*Dest = c;
				Dest++;
			}else{
				if((++i2)> TailleDest) return 0;
				*Dest = c;
				Dest++;
			}
		}else{
			if(Nbr>(0xFF-0xB0)){
				reste = Nbr;
				while(reste>(0xFF-0xB0)){
					i2 += 2;
					if(i2 > TailleDest) return 0;
					*Dest = 0xFF;
					Dest++;
					*Dest = c;
					Dest++;
					reste -= (0xFF-0xB0);
				}
				if(reste>0){
					i2 += 2;
					if(i2 > TailleDest) return 0;
					*Dest = 0xB0+reste;
					Dest++;
					*Dest = c;
					Dest++;
				}
			}else{
				i2 += 2;
				if(i2 > TailleDest) return 0;
				*Dest = 0xB0+Nbr;
				Dest++;
				*Dest = c;
				Dest++;
			}
			Src += Nbr-1;
			i += Nbr-1;
		}
	}
	return i2;
}

int RLE_Decompacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest){
	int i,i2=0,i3;
	unsigned char c,c2=0;
	for(i=0;i<TailleSrc;i++){
		c = *Src++;
		if(c2 == 0){
			if(c>0xB0){c2 = c-0xB0;continue;}
			if((++i2)>TailleDest) return 0;
			*Dest = c;
			Dest++;
		}else{
			for(i3=0;i3<c2;i3++){
				if((++i2)>TailleDest) return 0;
				*Dest = c;
				Dest++;
			}
			c2 = 0;
		}
	}
	return i2;
}

int RLE_Decompacte_ET(unsigned const char *Src,const int &TailleSrc){
	int i,i2=0;
	unsigned char c,c2=0;

	for(i=0;i<TailleSrc;i++){
		c = *Src++;
		if(c2 == 0){
			if(c>0xB0){c2 = c-0xB0;continue;}
			i2++;
		}else{
			i2 += c2;
			c2 = 0;
		}
	}

	return i2;
}

int RLE_Compacte_ET(unsigned const char *Src,const int &TailleSrc){
	int i,i2=0,Nbr,reste;
	unsigned char c;
	
	for(i=0;i<TailleSrc;i++){
		Nbr = NbrCarCons(Src,TailleSrc-i);
		c = *Src++;
		if(Nbr == 0) return 0;
		if(Nbr == 1){
			if(c>0xB0) i2+=2;
			else i2++;
		}else{
			if(Nbr>(0xFF-0xB0)){
				reste = Nbr;
				while(reste>(0xFF-0xB0)){
					i2 += 2;
					reste -= (0xFF-0xB0);
				}
				if(reste>0) i2 += 2;
			}else{
				i2 += 2;
			}
			Src += Nbr-1;
			i += Nbr-1;
		}
	}
	return i2;
}



bool CompacterFichier(const char *FichierDest,const char *FichierSrc,int methode){
	FILE	*Fichier;
	unsigned char	*ContenuSrc,*ContenuDest;
	int		TailleSrc,TailleDest;
	if((Fichier = fopen(FichierSrc,"rb")) == NULL) return false;
	fseek(Fichier,0,SEEK_END);
	TailleSrc = ftell(Fichier);
	fseek(Fichier,0,SEEK_SET);
	ContenuSrc = (unsigned char*) malloc(TailleSrc);
	fread(ContenuSrc,1,TailleSrc,Fichier);
	fclose(Fichier);
	
	TailleDest = RLE_Compacte_ET(ContenuSrc,TailleSrc);
	ContenuDest = (unsigned char*) malloc(TailleDest);

	TailleDest = RLE_Compacte(ContenuDest,ContenuSrc,TailleSrc,TailleDest);
	free(ContenuSrc);
	
	if((Fichier = fopen(FichierDest,"w")) == NULL){
		free(ContenuDest);
		return false;
	}
	fwrite(ContenuDest,1,TailleDest,Fichier);
	fclose(Fichier);
		
	free(ContenuDest);
	return true;
}

bool DecompacterFichier(const char *FichierDest,const char *FichierSrc,int methode){
	FILE	*Fichier;
	unsigned char	*ContenuSrc,*ContenuDest;
	int		TailleSrc,TailleDest;
	if((Fichier = fopen(FichierSrc,"rb")) == NULL) return false;
	fseek(Fichier,0,SEEK_END);
	TailleSrc = ftell(Fichier);
	fseek(Fichier,0,SEEK_SET);
	ContenuSrc = (unsigned char*) malloc(TailleSrc);
	fread(ContenuSrc,1,TailleSrc,Fichier);
	fclose(Fichier);

	TailleDest = RLE_Decompacte_ET(ContenuSrc,TailleSrc);
	ContenuDest = (unsigned char*) malloc(TailleDest);

	TailleDest = RLE_Decompacte(ContenuDest,ContenuSrc,TailleSrc,TailleDest);
	free(ContenuSrc);
	
	if((Fichier = fopen(FichierDest,"w")) == NULL){
		free(ContenuDest);
		return false;
	}
	fwrite(ContenuDest,1,TailleDest,Fichier);
	fclose(Fichier);
		
	free(ContenuDest);
	return true;
}
 

Conclusion

voila c'est tout con en fait les 2 algos importantes sont dans les fonctions :
int RLE_Decompacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);
int RLE_Compacte(unsigned char *Dest,unsigned const char *Src,const int &TailleSrc,const int &TailleDest);

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de FunkySteps le 13/03/2002 00:58:05

un code sans commentaire vaut de la merde !!!!!

signaler à un administrateur
Commentaire de SlimShadow le 11/02/2004 13:50:35

Pas forcement un code bien branlé n'a pas besoin de commentaire justement, on le comprend sans commentaire !
Mais ca veut pas dire que son code est bien ^^

signaler à un administrateur
Commentaire de FearBlue le 29/05/2004 22:02:51

Je suis d'accord avec toi SlimShadow.
Un code ne necessite pas forcement de commentaire.
S'il é bien foutus on le comprend tres bien
Aller @+

signaler à un administrateur
Commentaire de chicox le 14/04/2005 10:31:47

Moi je suis entierement d accord avec FunkySteps
un programme sans commentaire c est de la grosse daube. Et d ailleur si t avais un codage RLE et huffman (tant qu a faire) avec commentaire fais moi signe merci.

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Septembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
2930     

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,23 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.