begin process at 2012 02 09 13:58:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > COMPRESSION RLE (VC++ 5.0)

COMPRESSION RLE (VC++ 5.0)


 Information sur la source

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
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é :5 192 / 208

Auteur : Croqmort

Ecrire un message privé
Site perso
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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

LEPENWORLD : JEU AVEC LEPEN [VC++ 5.0][DIRECTX 7.0]
Source avec Zip Source avec une capture CLIENT IRC (VC++ 5.0)
EFFET DE FLAMME (SOUS DOS EN 320*200) (BC++)
Source avec Zip Source avec une capture CHIRACWORLD (VC++ 5.0)
Source avec Zip DIRECT DRAW, SOUND / HELLO WORLD (VC++ 5.0)

 Sources de la même categorie

Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel
Source avec Zip COPIE DE FICHIERS PAR RESEAU LOCAL par cczerty

Commentaires et avis

Commentaire de FunkySteps le 13/03/2002 00:58:05

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

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 ^^

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 @+

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

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,123 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales