怎么在iPhone开发中实现解压缩gzip?

转自:微点阅读  https://www.weidianyuedu.com

在iPhone开发中实现解压缩gzip是本文要介绍的内容,最近做的一个东西中,需要从网络获取xml文件,但是该文件用了gzip压缩的。搜索一 下有人说gzip压缩的用urlrequest可以自己解压,但是这必须从服务器返回的header中有accept-Encoding说明是gzip 的。也就是用这句就可以实现自解压:

[urlRequest addValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];

这个在我的项目中没有作用,因为服务器返回的header中没有Accept-Encoding的说明。这就需要手动解压了!解压需要导入libz.1.2.3.dylib库,导入#import "zlib.h"    

下面是解压的代码:

-(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;

}

}

小结:在iPhone开发中实现解压缩gzip的内容介绍完了,希望本文对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值