在iPhone開發(fā)中實(shí)現(xiàn)解壓縮gzip
在iPhone開發(fā)中實(shí)現(xiàn)解壓縮gzip是本文要介紹的內(nèi)容,最近做的一個(gè)東西中,需要從網(wǎng)絡(luò)獲取xml文件,但是該文件用了gzip壓縮的。搜索一 下有人說gzip壓縮的用urlrequest可以自己解壓,但是這必須從服務(wù)器返回的header中有accept-Encoding說明是gzip 的。也就是用這句就可以實(shí)現(xiàn)自解壓:
- [urlRequest addValue:@"gzip" forHTTPHeaderField:@"Accept-Encoding"];
這個(gè)在我的項(xiàng)目中沒有作用,因?yàn)榉?wù)器返回的header中沒有Accept-Encoding的說明。這就需要手動(dòng)解壓了!解壓需要導(dǎo)入libz.1.2.3.dylib庫,導(dǎo)入#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;
- }
- }
小結(jié):在iPhone開發(fā)中實(shí)現(xiàn)解壓縮gzip的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!