000
29.10.2003, 10:39 Uhr
~devil_78
Gast
|
hi ihr code gurus, ich hab ein kleines problem, ich muss projekt ein kleines komprimierungs und dekomprimierungsprogramm schreiben das bmp und text (andre auch) komprimieren soll..
Das Verfahren: Bei dem Verfahren werden die Zeichen byteweise eingelesen und gezählt. Folgen mehr als 3 gleiche Zeichen aufeinander, so werden sie gegen ein [Schlüsselzeichen], einen[Zähler] und das mehrfach vorkommende [Zeichen] ersetzt. Das Schlüsselzeichen wird für den Expander in die Datei geschrieben um ihm zu sagen, dass eine Ausnahme folgt und er sich dem Zähler entsprechend verhalten soll.
so das als kleine anleitung :-) und nu zu meinen problem...
ich kann zwar textdateien komprimieren und auch wieder entpacken aber beim komprimieren von bmp´s gibs fehler :-(
ich kann die einfach nicht wieder entpacken...
so und hier mal ein code... ich hoffe ihr könnt mir helfen
C/C++ Code:
C++: |
void CRled3Dlg::Komprimieren(CFile &QuellDatei, CFile &ZielDatei) { unsigned char cZeichen; unsigned char cNaechstesZeichen; unsigned char cZaehler = (unsigned char)1; unsigned char cEsc = (unsigned char)0x90; unsigned char cTempEsc = (unsigned char)0x0; int nEscWechsel = 1024; int nZaehlerBytes = 1; //Header in Zieldatei schreiben unsigned char cHeader[4] ={'R','L','3',(unsigned char)0x90}; ZielDatei.Write(cHeader,4); if (QuellDatei.Read(&cZeichen,1)) { //solange lesen wie ein Zeichen gefunden wird while (QuellDatei.Read (&cNaechstesZeichen,1)) { nZaehlerBytes++; if (cZeichen == cEsc) { ZielDatei.Write(&cEsc,1); ZielDatei.Write(&cTempEsc,1); cZaehler = 1; cZeichen = cNaechstesZeichen; } else { if(cZeichen == cNaechstesZeichen && cZaehler < 255) { cZaehler++; } else { if ((int)cZaehler > 3) { ZielDatei.Write(&cEsc,1); ZielDatei.Write(&cZaehler,1); ZielDatei.Write(&cZeichen,1); cZaehler = (unsigned char)1; cZeichen = cNaechstesZeichen; } else { for (int nI = 0; nI < (int)cZaehler; nI++) { ZielDatei.Write(&cZeichen,1); } cZaehler = (unsigned char)1; cZeichen = cNaechstesZeichen; } } } }// Ende while (QuellDatei.Read (&cNaechstesZeichen,1) if (cZaehler > 3) { ZielDatei.Write(&cEsc,1); ZielDatei.Write(&cZaehler,1); ZielDatei.Write(&cZeichen,1); cZaehler = 1; cZeichen = cNaechstesZeichen; } else { for (int nI = 0; nI < cZaehler; nI++) { ZielDatei.Write(&cZeichen,1); } } }//ende if (QuellDatei.Read(&cZeichen,1)
}
|
edit by virtual: code tags eingefügt Dieser Post wurde am 29.10.2003 um 11:02 Uhr von virtual editiert. |