gpt4 book ai didi

android - zlib 膨胀返回 Z_BUF_ERROR

转载 作者:行者123 更新时间:2023-11-29 00:21:25 25 4
gpt4 key购买 nike

我正在接收来自 android 客户端的流,该流使用 standard zlib(链接到 -lz)压缩。以下方法在尝试对其充气时出现 Z_BUF_ERROR 错误

if(!rawData)
rawData= (char *)malloc(480 * 800 * 8);
int bufferLength = 128 * 1024;
char *tmpbuffer = malloc(bufferLength);
zUnzip.next_in = (Bytef *)inputStream;
zUnzip.avail_in = size;
zUnzip.next_out = (Bytef *)tmpbuffer; //output location of uncompressed stream
zUnzip.avail_out = bufferLength; //total size of output buffer
zUnzip.data_type = Z_BINARY;

inflateResult = inflateInit( &zUnzip); //standard zlib function, see <zlib.h>
if ( inflateResult != Z_OK ) {
LOGE("inflateInit returned error: %d, msg: %s\n",inflateResult,zUnzip.msg);
}

do{
inflateResult = inflate( &zUnzip, Z_SYNC_FLUSH );
LOGE("avail_out = %d : difference = %d",zUnzip.avail_out,bufferLength-zUnzip.avail_out);
memcpy(rawData,tmpbuffer,bufferLength);
rawData+=bufferLength;
zUnzip.next_out = (Bytef *)tmpbuffer; //output location of uncompressed stream
zUnzip.avail_out = bufferLength; //total size of output buffer

}while(( inflateResult == Z_STREAM_END )) ;

if ( inflateResult < 0 ) {
LOGE("zlib inflate returned error: %d, msg: %s\n",inflateResult,zUnzip.msg);
return FALSE;
}

大小为 16741 字节的 inputStream 的 logcat 输出

04-03 07:32:01.900: E/sc_client(25100): avail_out = 0 : difference = 131072
04-03 07:32:01.900: E/sc_client(25100): avail_out = 0 : difference = 131072
04-03 07:32:01.905: E/sc_client(25100): avail_out = 45672 : difference = 85400
04-03 07:32:01.905: E/sc_client(25100): avail_out = 131072 : difference = 0
04-03 07:32:01.905: E/sc_client(25100): zlib inflate returned error: -5, msg: (null)

注意:输入流是原始压缩流(zlib deflate 调用的直接输出)!

更新:放气部分

rfbBool zrleOutStreamFlush(zrleOutStream *os){
os->zs.next_in = os->in.start;
os->zs.avail_in = ZRLE_BUFFER_LENGTH (&os->in);

while (os->zs.avail_in != 0) {
do {
int ret;
os->zs.next_out = os->out.ptr;
os->zs.avail_out = os->out.end - os->out.ptr;


if ((ret = deflate(&os->zs, Z_SYNC_FLUSH)) != Z_OK) {
Log("zrleOutStreamFlush: deflate failed with error code %d\n", ret);
return FALSE;
}

os->out.ptr = os->zs.next_out;
} while (os->zs.avail_out == 0);
}

os->in.ptr = os->in.start;
LOGE("zrleOutStreamFlush: total_in %ld : total_out %ld ", os->zs.total_in,os->zs.total_out);
return TRUE;
}

结构定义:

typedef struct {
zrle_U8 *start;
zrle_U8 *ptr; //from start to ptr, we have data
zrle_U8 *end;
} zrleBuffer;

typedef struct {
zrleBuffer in; //input buffer
zrleBuffer out; //output buffer

z_stream zs;
} zrleOutStream;

最佳答案

您提供的压缩流 inputStream[0..size-1] 不完整。 inflate() 的第三次调用已经处理了您提供的所有输入数据,但它还没有看到 deflate 流的结尾。如果此时检查 avail_in,您会看到它为零。

顺便说一下,你不需要设置data_type。这由 zlib 设置。它仅供引用,可以忽略。

关于android - zlib 膨胀返回 Z_BUF_ERROR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22832953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com