2016-07-02 51 views
0

我試圖使用zlib的compress()函數來壓縮圖像數據。爲此,我將等於輸入數據的compressBound()的內存分配給輸出緩衝區。但我不斷收到Z_BUF_ERROR。爲什麼會發生?zlib輸出內存緩衝區大小錯誤

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); 
    } 

的返回值錯誤檢查是通過此功能進行:

/* 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; 
    } 
} 

當我每個compress()函數被調用時運行該程序,我得到zpipe: error in buffer(在zerr()函數最後一種情況下)。內存分配也不會失敗,因爲我已經包含了它的條件,並且每次調用循環時它的計算結果都是false。

+0

什麼版本的zlib?你能提供一個這種情況發生的未壓縮數據的例子嗎? –

+0

zlib版本1.2.8。示例意味着?我試圖壓縮的數據是圖像像素數據。 – Pranjal

+0

是的,那個數據。你能否提供一個你提供給'compress()'的確切數據的例子,導致壓縮的數據不適合'compressBound()'返回的內容? –

回答

1

你問開往壓縮一定數量的字節,內存:

destLen = compressBound(header.cupsBytesPerLine); 

但是,然後嘗試比你已經計算出的界壓縮1更字節。

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

我真的很抱歉,我正在試驗這件事,這就是爲什麼我想要嘗試+1。但實際上,即使沒有+1,錯誤依然存在。我已經在源代碼中編輯它。對不起 – Pranjal

+0

'destLen'爲零? – jxh

+0

不,它顯示'mem。 DEST。 = 14890' – Pranjal