2016-07-02 21 views
0

Ich versuche, Bilddaten mit zlib compress() Funktion zu komprimieren. Zu diesem Zweck ordne ich dem Ausgabepuffer Speicher gleich von Eingabedaten zu. Aber ich bekomme immer die Z_BUF_ERROR. Warum passiert es?zlib Ausgabespeicher Puffergröße Fehler

for (y = 0; y < header.cupsHeight; y ++) 
{ 
    pixdata = malloc(header.cupsBytesPerLine); 

    if(pixdata==NULL) 
    { 
     fprintf(stderr,"error in memory allocation for pixdata\n"); 
     return -1; 
    } 
    cupsRasterReadPixels(ras, pixdata, header.cupsBytesPerLine); 

    destLen = compressBound(header.cupsBytesPerLine); 
    fprintf(stderr, "mem. dest. = %lld\n",destLen); 
    write_buffer = malloc(destLen); 
    if(write_buffer==NULL) 
    { 
     fprintf(stderr,"error in memory allocation for write_buffer\n"); 
     return -1; 
    } 
    ret = compress(write_buffer, &destLen, pixdata, header.cupsBytesPerLine); 
    if (ret != Z_OK) 
     zerr(ret); 
    fwrite(write_buffer, 1, destLen, stdout); 
    free(write_buffer); 
     free(pixdata); 
    } 

Fehlerüberprüfung des Wertes zurückgegeben wird durch diese Funktion ausgeführt:

/* report a zlib or i/o error */ 
void zerr(int ret) 
{ 
    fputs("zpipe: ", stderr); 
    switch (ret) { 
    case Z_ERRNO: 
     fputs("error in source data or output file\n", stderr); 
     break; 
    case Z_STREAM_ERROR: 
     fputs("invalid compression level\n", stderr); 
     break; 
    case Z_DATA_ERROR: 
     fputs("invalid or incomplete deflate data\n", stderr); 
     break; 
    case Z_MEM_ERROR: 
     fputs("out of memory\n", stderr); 
     break; 
    case Z_VERSION_ERROR: 
     fputs("zlib version mismatch!\n", stderr); 
     break; 
    case Z_BUF_ERROR: 
      fputs("error in buffer\n",stderr); 
      break; 
    } 
} 

Wenn ich das Programm jedes Mal, wenn die compress() Funktion ausführen aufgerufen wird, ich zpipe: error in buffer (der letzten Fall in zerr() Funktion) erhalten. Auch die Speicherzuweisung schlägt nicht fehl, da ich die Bedingung für sie eingefügt habe und sie jedes Mal, wenn die Schleife aufgerufen wird, zu false führt.

+0

Welche Version von zlib? Können Sie ein Beispiel für unkomprimierte Daten angeben, für die dies geschieht? –

+0

zlib Version 1.2.8. Beispiel bedeutet? Die Daten, die ich zu komprimieren versuche, sind Bildpixeldaten. – Pranjal

+0

Ja, diese Daten. Können Sie ein Beispiel für die exakten Daten angeben, die Sie in 'compress()' eingegeben haben und die zu komprimierten Daten geführt haben, die nicht in das passen, was von 'compressBound()' zurückgegeben wurde? –

Antwort

1

Sie fragen nach dem Speicher gebunden für eine bestimmte Anzahl von Bytes komprimiert:

destLen = compressBound(header.cupsBytesPerLine); 

Aber dann versuchen Sie 1 mehr Byte zu komprimieren als das, was man die Grenze für berechnet hatte.

ret = compress(write_buffer, &destLen, pixdata, header.cupsBytesPerLine+1); 
+0

Es tut mir wirklich leid, ich experimentierte mit diesem Ding und deshalb dachte ich daran, +1 zu versuchen. Aber tatsächlich bleibt der Fehler auch ohne +1 bestehen. Ich habe es im Quellcode bearbeitet. Sorry – Pranjal

+0

War 'destLen' null? – jxh

+0

Nein, es zeigt 'mem. dest. = 14890' – Pranjal