1
서버에서 클라이언트로 전송 된 패키지의 압축을 풀고 싶습니다.zlib.h에서 inflate를 사용하여 클라이언트에서 서버로 보낸 압축 해제 패키지를 사용할 때 z_stream.avail_out 값을 초기화하십시오.
패키지 크기가 작 으면 아래 코드는 정상입니다.
그러나 패키지 크기가 클수록 out_length 변수의 값은 1024보다 커야합니다. 그렇게하고 싶지는 않습니다. 동적 방법이 필요합니다. 패키지의 크기가 커지면 out_length를 변경할 필요가 없습니다. 도와주세요. 고정 된 크기의 버퍼와 inflate()
을 사용하는 방법에 대한 this example에서
int Decompress(BYTE *src, int srcLen, BYTE *dst)
{
static char dummy_head[2] =
{
0x8 + 0x7 * 0x10,
(((0x8 + 0x7 * 0x10) * 0x100 + 30)/31 * 31) & 0xFF,
};
int out_length = 1024;
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.next_in = (Bytef *)src;
strm.avail_in = srcLen;
strm.next_out = (Bytef *)dst;
strm.avail_out = out_length;
/** 15 window bits, and the +32 tells zlib to to detect if using gzip or zlib **/
int ret = inflateInit2(&strm, 15 + 32);
if (ret != Z_OK)
{
return -1;
}
while (strm.total_out < out_length && strm.total_in < srcLen)
{
/* force small buffers */
strm.avail_in = strm.avail_out = 1;
if((ret = inflate(&strm, Z_NO_FLUSH)) == Z_STREAM_END)
{
break;
}
if(ret != Z_OK)
{
if(ret == Z_DATA_ERROR)
{
strm.next_in = (Bytef*) dummy_head;
strm.avail_in = sizeof(dummy_head);
if((ret = inflate(&strm, Z_NO_FLUSH)) != Z_OK)
{
return -1;
}
}
else
{
return -1;
}
}
}
// realease the memory for z_stream
if (inflateEnd(&strm) != Z_OK)
{
return -1;
}
return strm.total_out;
}
의견을 보내 주셔서 감사합니다. 다시 작성하겠습니다. –
이제 풍선을 사용할 수 있습니다. 나는 수축을 시험하고있다. 괜찮 으면 나는이 답에 답을 표시 할 것이다. –