2013-08-06 4 views
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; 
} 

답변

1

봐. 당신이 묻는 것을 이해한다면,이 예제는 모든 데이터가 압축 해제 될 때까지 동일한 출력 버퍼를 재사용합니다. 다음 번에 덮어 쓰기 때문에 매번 출력 버퍼에있는 압축되지 않은 데이터로 무언가를해야합니다. Decompress() 함수는 압축되지 않은 데이터로 아무 작업도 수행하지 않습니다.

+0

의견을 보내 주셔서 감사합니다. 다시 작성하겠습니다. –

+0

이제 풍선을 사용할 수 있습니다. 나는 수축을 시험하고있다. 괜찮 으면 나는이 답에 답을 표시 할 것이다. –