我試圖使用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。
什麼版本的zlib?你能提供一個這種情況發生的未壓縮數據的例子嗎? –
zlib版本1.2.8。示例意味着?我試圖壓縮的數據是圖像像素數據。 – Pranjal
是的,那個數據。你能否提供一個你提供給'compress()'的確切數據的例子,導致壓縮的數據不適合'compressBound()'返回的內容? –