0x00 ist bei txt anders als bei bmp´s ! KOMISCH

Du reservierst zb 4 extra bytes am Ende des komprimierten buffers, in die die Grösse des unkomprimierten buffers reinschreibst, wenn du jetzt dekomprimierst greifst du einfach auf die 4 bytes zu (ihre Position kennst du ja => Grösse des komprimierten buffers -4), so hast du dann deine Ausgangsgrösse wieder.
 
Hallo

danke für den Tip! Hört sich gut an!
Wir haben es jetzt zwar mit der deflate und inflate 100% am laufen!
Aber dennoch würde es uns interessieren wie das mit der compres2 / decompress geht!

Also wir sollen an den BYTE wert 4 byte anfügen?
Code:
Byte *original (unsigned char*) Puffer;
Byte *zip = new Byte [10000];
uLong zipLen = 10000, orgLen = Dateigroesse;
wert = compress2 (zip, &zipLen, original,orgLen,9);
Was ist der Befehl für das anfügen von 4 Byte an BYTE
Sowas wie strcat(....) für BYTE

thx a lot

sven
 
So einen Befehl gibt es nicht.
Du brauchst einen zweiten grösseren Speicherbereich (oder ist der schon gross genug?) und dann kannst du da irgendwelche Werte (zum Beispiel die 4 Byte) rein-memcpy-en. Als Zielparameter nimmst du dann einfach die Start-Adresse des Speicherbereichs plus die Grösse der schon geschriebenen Daten in Bytes (die Startadresse MUSS ein byte- oder char-Pointer sein, sonst stimmt die Endadresse nicht!).
 
Laut Doku beinhaltet destLen (bzw. bei dir zipLen) nach dem Aufruf die tatsächlich geschriebene Grösse in Bytes.
 
Ja leider nicht laut doku geben defalte & inflate als rückgabe wert die größe an! Die compress2 und decopress geben einen Fehlercode zurück!
LEIDER!
sven
 
Zuletzt bearbeitet:
Code:
Bytef* original;
uLong orgLen;


// hier vermittelst jetzt original den Ausgangsdateibuffer
// und orgLen die Ausgangsdateigrösse via ReadFile() und
// GetFileSize() oder was auch immer
// ...



// hier checkst du die Mindestgrösse des komprimierten buffers
uLong zipLen = compressBound(orgLen);


// hier reservierst du Speicher (+ 4 um orgLen zu speichern)
Bytef* zip = new Bytef[zipLen + 4];


// compress2 Funktion
compress2(zip, &ziplen, (const Bytef*)original, orgLen, 9);

// speichern der Grösse am Ende des buffers
*((DWORD*)(zip + zipLen)) = orgLen;

// jetzt den buffer in eine Datei schreiben
// ...
Wenn du irgendwann später dekomprimieren willst, machst du folgendes:
Code:
// ermitteln des komprimierten buffers und seine grösse
// zb in zip und zipLen (via ReadFile, blabla...)
// ...

// ermitteln von orgLen
uLong orgLen = *((DWORD*)(zip + zipLen - 4));

// speicherreservierung für original
Bytef* original = new Bytef[orgLen];

//decompress Funktion
uncompress(original, &orgLen, (const Bytef*)zip, zipLen - 4);
usw...
 
Zuletzt bearbeitet:
Zurück