|
Trouver une ressource
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
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
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
|