PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie funktioniert zlib?



Giuly
16-03-2005, 18:23
hi,
wie kann ich mit zlib MÖGLICHST EINFACH eine datei decompressen? durch decompress() steig ich irgendwie nicht durch, ich kann mit nicht vorstellen was ein "Bytef" sein soll.
MfG Giuly

Beatkiller
16-03-2005, 19:32
Dann nimm einfach Huffman:

http://www.programmersheaven.com/search/download.asp?FileID=2185

ist ganz einfach... ;)

Giuly
16-03-2005, 20:01
das sollte aber schon zlib sein. Ich bin jetzt auch schon weiter, aber so ganz hab ichs noch nicht verstanden. Zumal ich auch nicht file->file will, sondern file->string oder file->char*

Edit: kann ich irgendwie überprüfen, ob ein strcat() erfolgreich war?

Edit2: das ganze will nicht so wie ich will.

int decompr(char* file, char* returned)
{
int toReturn;
char in[RSIZE];
char out[RSIZE];
unsigned have;

FILE* fd = fopen(file, "rb");

z_stream zs;
zs.zalloc = Z_NULL;
zs.zfree = Z_NULL;
zs.opaque = Z_NULL;
zs.avail_in = 0;
zs.next_in = Z_NULL;
toReturn = inflateInit(&zs);
if(toReturn != Z_OK) return toReturn;

do {
zs.avail_in = fread(in, 1, RSIZE, fd);
if(ferror(fd)) {
(void)inflateEnd(&zs);
return Z_ERRNO;
}
if(zs.avail_in == 0) break;
zs.next_in = in; // Line 44

do {
zs.avail_out = RSIZE;
zs.next_out = out; // Line 48
toReturn = inflate(&zs, Z_NO_FLUSH);
assert(toReturn != Z_STREAM_ERROR);

switch(toReturn) {
case Z_NEED_DICT:
toReturn = Z_DATA_ERROR;
case Z_DATA_ERROR:
case Z_MEM_ERROR:
(void)inflateEnd(&zs);
return toReturn;
}
have = RSIZE - zs.avail_out;

int tst = strlen(returned);
returned = realloc(returned, tst+have+10); // Line 63

if(strlen(strcat(returned, out))!= tst+have-1) {
(void)inflateEnd(&zs);
return Z_ERRNO;
}
} while(zs.avail_out == 0);
assert(zs.avail_in == 0);
} while(toReturn != Z_STREAM_END);
(void)inflateEnd(&zs);
return toReturn == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
}

Macht bei mir das da:
giuly@goldstueck GeeLightScribe $ gcc -o functions.o functions.cpp -lz
functions.cpp: In function `int decompr(char*, char*)':
functions.cpp:44: error: invalid conversion from `char*' to `Bytef*'
functions.cpp:48: error: invalid conversion from `char*' to `Bytef*'
functions.cpp:63: error: invalid conversion from `void*' to `char*'


Edit3: Ich hab das mal hochgeladen..

Edit4: Vergesst es. Ich hatte keinen Bock mehr, und es darum komplett in C statt C und C++ geschrieben, jetzt gehts.

Edit5: Ein Problem bleibt jedoch: Wie schreibe ich statt in eine datei
if (fwrite(out, 1, have, asd) != have || ferror(asd)) {
(void)inflateEnd(&strm);
return Z_ERRNO;
}
in ein char*?

Edit6: ICh weiß jetzt warum C++ nicht ging. CC=gcc in der Makefile tut nicht gut ;) Also Edit6 kann ruhig mit streams sein :)

Edt7: JEtzt geht alles :)