komprimieren... wer kann helfen
-
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
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) }
-
Ich Tip mal darauf, dass Du Dein Esc-Zeichen nicht richtig behandelst.
Beim Kompremieren schauste schon nach. Aber vieleicht verpaßte das beim Endpacken? Schreib Dir einfach mal eine Datei mit z.B. folgenes Inhalt "0x90 0x00 x90 x90". Wenn die nicht geht weißte ja wodran es liegt.
MfG Gabriel
-
hallo gabriel,
danke für deine antwort...
leider muss auch noch ein fehler beim komprimieren sein.. im gegensatz du dem progi von meinen prof sind die dateien von meinen progi 2kb zu gross
so damit ihr alle nochmal einen überblick habt nochmal der code zum dekomprimieren
void CRled3Dlg::Dekomprimieren(CStdioFile &QuellDatei, CStdioFile &ZielDatei) { unsigned char cHeader[4]; unsigned char cEsc; unsigned char cZeichen; int nZaehler = 0; QuellDatei.Read(cHeader,3); cHeader[3] = NULL; QuellDatei.Read(&cEsc,1); if( cHeader[0] == 'R' && cHeader[1] == 'L' && cHeader[2] == '3' ) // wenn tatsächlich 4 Zeichen gelesen { while (QuellDatei.Read(&cZeichen,1)) { if (cZeichen == cEsc) { QuellDatei.Read(&cZeichen,1); if (cZeichen == (unsigned char) 0) { ZielDatei.Write(&cEsc,1); } else { if (cZeichen == (unsigned char) 1) { QuellDatei.Read(&cZeichen,1); cEsc = cZeichen; } else { if ( ((int)cZeichen > 3 )) { nZaehler = (int) cZeichen; QuellDatei.Read(&cZeichen,1); for ( int nI = 0; nI < nZaehler; nI++ ) { ZielDatei.Write(&cZeichen,1); } } } } } else { ZielDatei.Write(&cZeichen,1); } } } }
-
kann denn keiner bischen helfen
