iOS 对字符串压缩

来源:互联网 发布:cydia怎么删除软件 编辑:程序博客网 时间:2024/05/19 01:09


一般都是对文件进行压缩的,这里的代码是对字符串进行压缩和解压缩

压缩字符串


- (NSData *)gzipDeflate:(NSString*)str{    NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];    if ([data length] == 0) return data;        z_stream strm;        strm.zalloc = Z_NULL;    strm.zfree = Z_NULL;    strm.opaque = Z_NULL;    strm.total_out = 0;    strm.next_in=(Bytef *)[data bytes];    strm.avail_in = [data length];        // Compresssion Levels:    //   Z_NO_COMPRESSION    //   Z_BEST_SPEED    //   Z_BEST_COMPRESSION    //   Z_DEFAULT_COMPRESSION        if (deflateInit2(&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 >= [compressed length])            [compressed increaseLengthBy: 16384];                strm.next_out = [compressed mutableBytes] + strm.total_out;        strm.avail_out = [compressed length] - strm.total_out;                deflate(&strm, Z_FINISH);            } while (strm.avail_out == 0);        deflateEnd(&strm);        [compressed setLength: strm.total_out];    return [NSData dataWithData:compressed];}


解压缩


- (NSData *)gzipInflate:(NSData*)data{    if ([data length] == 0) return data;        unsigned full_length = [data length];    unsigned half_length = [data length] / 2;        NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];    BOOL done = NO;    int status;        z_stream strm;    strm.next_in = (Bytef *)[data bytes];    strm.avail_in = [data length];    strm.total_out = 0;    strm.zalloc = Z_NULL;    strm.zfree = Z_NULL;        if (inflateInit2(&strm, (15+32)) != Z_OK)        return nil;        while (!done)    {        // Make sure we have enough room and reset the lengths.        if (strm.total_out >= [decompressed length])            [decompressed increaseLengthBy: half_length];        strm.next_out = [decompressed mutableBytes] + strm.total_out;        strm.avail_out = [decompressed length] - strm.total_out;                // Inflate another chunk.        status = inflate (&strm, Z_SYNC_FLUSH);        if (status == Z_STREAM_END)            done = YES;        else if (status != Z_OK)            break;    }    if (inflateEnd (&strm) != Z_OK)        return nil;        // Set real length.    if (done)    {        [decompressed setLength: strm.total_out];        return [NSData dataWithData: decompressed];    }    else return nil;}




0 0
原创粉丝点击