iOS GZIP 字符串解压

   JAVA后台,将一个base64的字符串通过GZIP压缩成了另一个字符串,iOS端需要先解压,然后转为base64,最后转成图片。找到一个NSData解压的方法,就先把字符串original转成NSdata,解压,然后转回字符串result,这个result就是original解压出来的字符串。转成图片,OK。下面是代码。

//后台返回的字符串

       NSString * original = dict[@"imgblob"];

//字符串转NSdata,注意编码格式

       NSData * dataGzip = [original dataUsingEncoding:NSISOLatin1StringEncoding];

//解压

       NSData * uncompress = [LFCGzipUtillity uncompressZippedData:dataGzip];

//将解压出来的NSdata转成NSString(这就是后台传过来的字符串经过解压处理后的结果字符串)

       NSString * result = [[NSString alloc] initWithData:uncompress encoding:NSISOLatin1StringEncoding];

//将这个字符串(是经过base64转码的字符串)转为NSdata

        NSData * data =[[NSData alloc] initWithBase64EncodedString:result options:NSDataBase64DecodingIgnoreUnknownCharacters];

//NSdata转为UIimage

        UIImage * image = [UIImage imageWithData:data];

        _sceneControlImg.image = image;


解压方法如下 

+(NSData *)uncompressZippedData:(NSData *)compressedData  {  

if ([compressedData length] == 0) return compressedData;  

    unsigned full_length = [compressedData length];  

    unsigned 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 = [compressedData 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;  

    }  

}


另附GZIP压缩方法:



+ (NSData *)gzipData:(NSData *)pUncompressedData

{

if (!pUncompressedData || [pUncompressedData length] == 0) {

NSLog(@"%s: Error: Can't compress an empty or nil NSData object",__func__);

return nil;

}

z_stream zlibStreamStruct;

zlibStreamStruct.zalloc = Z_NULL;

zlibStreamStruct.zfree = Z_NULL;

zlibStreamStruct.opaque = Z_NULL;

zlibStreamStruct.total_out = 0;

zlibStreamStruct.next_in = (Bytef *)[pUncompressedData bytes];

zlibStreamStruct.avail_in = [pUncompressedData length];

int initError = deflateInit2(&zlibStreamStruct, Z_DEFAULT_COMPRESSION, Z_DEFLATED, (15+16), 8, Z_DEFAULT_STRATEGY);

if (initError != Z_OK) {

NSString *errorMsg = nil;

switch (initError) {

case Z_STREAM_ERROR:

errorMsg = @"Invalid parameter passed in to function.";

break;

case Z_MEM_ERROR:

errorMsg = @"Insufficient memory.";

break;

case Z_VERSION_ERROR:

errorMsg = @"The version of zlib.h and the version of the library linked do not match.";

break;

default:

errorMsg = @"Unknown error code.";

break;

}

NSLog(@"%s:deflateInit2() Error: \"%@\" Message: \"%s\"",__func__,errorMsg,zlibStreamStruct.msg);

return nil;

}

NSMutableData *compressedData = [NSMutableData dataWithLength:[pUncompressedData length] * 1.01 + 21];

int deflateStatus;

do {

zlibStreamStruct.next_out = [compressedData mutableBytes] + zlibStreamStruct.total_out;

zlibStreamStruct.avail_out = [compressedData length] - zlibStreamStruct.total_out;

deflateStatus = deflate(&zlibStreamStruct, Z_FINISH);

} while (deflateStatus == Z_OK);

if (deflateStatus != Z_STREAM_END

{

  NSString *errorMsg = nil;

  switch (deflateStatus) {

  case Z_ERRNO:

  errorMsg = @"Error occured while reading file.";

  break;

  case Z_STREAM_ERROR:

  errorMsg = @"The stream state was inconsistent (e.g., next_in or next_out was NULL).";

    break;

  case Z_DATA_ERROR:

  errorMsg = @"The deflate data was invalid or incomplete.";

  break;

  case Z_MEM_ERROR:

  errorMsg = @"Memory could not be allocated for processing.";

  break;

  case Z_BUF_ERROR:

  errorMsg = @"Ran out of output buffer for writing compressed bytes.";

  break;

  case Z_VERSION_ERROR:

  errorMsg = @"The version of zlib.h and the version of the library linked do not match.";

  break;  

  default:

  errorMsg = @"Unknown error code.";

  break;

  }

  NSLog(@"%s:zlib error while attempting compression: \"%@\" Message: \"%s\"", __func__, errorMsg, zlibStreamStruct.msg);

  deflateEnd(&zlibStreamStruct);

  return nil;

}

deflateEnd(&zlibStreamStruct);

[compressedData setLength:zlibStreamStruct.total_out];

NSLog(@"%s: Compressed file from %d B to %d B", __func__, [pUncompressedData length], [compressedData length]);

return compressedData;

}



  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值