Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>I use the following two methods.</p> <p>Compress:</p> <pre><code>+(NSData*) compressData:(NSData*) uncompressedData { if ([uncompressedData length] == 0) return uncompressedData; z_stream strm; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; strm.opaque = Z_NULL; strm.total_out = 0; strm.next_in=(Bytef *)[uncompressedData bytes]; strm.avail_in = (unsigned int)[uncompressedData length]; // Compresssion Levels: // Z_NO_COMPRESSION // Z_BEST_SPEED // Z_BEST_COMPRESSION // Z_DEFAULT_COMPRESSION if (deflateInit2(&amp;strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY) != Z_OK) return nil; NSMutableData *compressed = [NSMutableData dataWithLength:16384]; // 16K chunks for expansion do { if (strm.total_out &gt;= [compressed length]) [compressed increaseLengthBy: 16384]; strm.next_out = [compressed mutableBytes] + strm.total_out; strm.avail_out = (unsigned int)([compressed length] - strm.total_out); deflate(&amp;strm, Z_FINISH); } while (strm.avail_out == 0); deflateEnd(&amp;strm); [compressed setLength: strm.total_out]; return [NSData dataWithData:compressed]; } </code></pre> <p>Uncompress:</p> <pre><code>+(NSData*) uncompressGZip(NSData*) compressedData { if ([compressedData length] == 0) return compressedData; NSUInteger full_length = [compressedData length]; NSUInteger half_length = [compressedData length] / 2; NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length]; BOOL done = NO; int status; z_stream strm; strm.next_in = (Bytef *)[compressedData bytes]; strm.avail_in = (unsigned int)[compressedData length]; strm.total_out = 0; strm.zalloc = Z_NULL; strm.zfree = Z_NULL; if (inflateInit2(&amp;strm, (15+32)) != Z_OK) return nil; while (!done) { // Make sure we have enough room and reset the lengths. if (strm.total_out &gt;= [decompressed length]) { [decompressed increaseLengthBy: half_length]; } strm.next_out = [decompressed mutableBytes] + strm.total_out; strm.avail_out = (unsigned int)([decompressed length] - strm.total_out); // Inflate another chunk. status = inflate (&amp;strm, Z_SYNC_FLUSH); if (status == Z_STREAM_END) { done = YES; } else if (status != Z_OK) { break; } } if (inflateEnd (&amp;strm) != Z_OK) return nil; // Set real length. if (done) { [decompressed setLength: strm.total_out]; return [NSData dataWithData: decompressed]; } else { return nil; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

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