Note that there are some explanatory texts on larger screens.

plurals
  1. POzLib on iPhone, stop at first BLOCK
    text
    copied!<p>I am trying to call iPhone zLib to decompress the zlib stream from our HTTP based server, but the code always stop after finishing the first zlib block. </p> <p>Obviously, iPhone SDK is using the standard open Zlib. My doubt is that the parameter for <strong>inflateInit2</strong> is not appropriate here.</p> <p>I spent lots of time reading the zlib manual, but it isn't that helpful.</p> <p>Here is the details, your help is appreciated.</p> <p>(1) the HTTP request: </p> <pre><code>NSURL *url = [NSURL URLWithString:@"http://192.168.0.98:82/WIC?query=getcontacts&amp;PIN=12345678&amp;compression=Y"]; </code></pre> <p>(2) The data I get from server is something like this (if decompressed). The stream was compressed by C# zlib class <strong>DeflateStream</strong>:</p> <pre><code>$REC_TYPE=SYS Status=OK Message=OK SetID= IsLast=Y StartIndex=0 LastIndex=6 EOR </code></pre> <p>......</p> <pre><code>$REC_TYPE=CONTACTSDISTLIST ID=2 Name=CTU+L%2EA%2E OnCallEnabled=Y OnCallMinUsers=1 OnCallEditRight= OnCallEditDLRight=D Fields= CL= OnCallStatus= EOR </code></pre> <p>(3) However, I will only get the first Block. The code for decompression on iPhone (copied from a code piece <a href="http://www.cocoadev.com/index.pl?NSDataCategory" rel="nofollow noreferrer">from somewhere here</a>) is as follow. <strong>The loop between Line 23~38 always break the second time execution.</strong></p> <pre><code> + (NSData *) uncompress: (NSData*) data { 1 if ([data length] == 0) return nil; 2 NSInteger length = [data length]; 3 unsigned full_length = length; 4 unsigned half_length =length/ 2; 5 NSMutableData *decompressed = [NSMutableData dataWithLength: 5*full_length + half_length]; 6 BOOL done = NO; 7 int status; 8 z_stream strm; 9 length=length-4; 10 void* bytes= malloc(length); 11 NSRange range; 12 range.location=4; 13 range.length=length; 14 [data getBytes: bytes range: range]; 15 strm.next_in = bytes; 16 strm.avail_in = length; 17 strm.total_out = 0; 18 strm.zalloc = Z_NULL; 19 strm.zfree = Z_NULL; 20 strm.data_type= Z_BINARY; 21 // if (inflateInit(&amp;strm) != Z_OK) return nil; 22 if (inflateInit2(&amp;strm, (-15)) != Z_OK) return nil; //It won't work if change -15 to positive numbers. 23 while (!done) 24 { 25 // Make sure we have enough room and reset the lengths. 26 if (strm.total_out &gt;= [decompressed length]) 27 [decompressed increaseLengthBy: half_length]; 28 strm.next_out = [decompressed mutableBytes] + strm.total_out; 29 strm.avail_out = [decompressed length] - strm.total_out; 30 31 // Inflate another chunk. 32 status = inflate (&amp;strm, Z_SYNC_FLUSH); //Z_SYNC_FLUSH--&gt;Z_BLOCK, won't work either 33 if (status == Z_STREAM_END){ 34 35 done = YES; 36 } 37 else if (status != Z_OK) break; 38 } 39 if (inflateEnd (&amp;strm) != Z_OK) return nil; 40 // Set real length. 41 if (done) 42 { 43 [decompressed setLength: strm.total_out]; 44 return [NSData dataWithData: decompressed]; 45 } 46 else return nil; 47 } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload