iOS gzip解压

1. 导入libz库(如:libz 1.2.5.dylib)

2. 引入头文件

#import "zlib.h"

3. 实现解压(输入输出都为NSData对象)

-(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];
        }
        // chadeltu 加了(Bytef *)
        strm.next_out = (Bytef *)[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解压,mapFilePath为待解压文件路径
NSData *dataInitial = [NSData dataWithContentsOfFile:mapFilePath];	// 解压前
NSData *dataUncompressed = [self uncompressZippedData:dataInitial];	// 解压后

参考博客:

在iPhone开发中实现解压缩gzip

时间: 2024-10-21 04:47:29

iOS gzip解压的相关文章

iOS客户端的gzip解压

服务端使用gzip压缩,可以大幅度减小传输包的体积,加快客户端网络请求速度,为用户节省流量.当服务器返回的httpHeader的"Content-Encoding" 属性的值是gzip时,数据会自动被解压缩,但有时候在客户端还没拿到数据的时候,就已经被某些网关解压了,这样gzip就没有起到作用.因此可以约定其他策略,防止网关解压,例如在别的头属性中标记gzip. 如此,就需要我们自己来解压gzip数据.方法如下:添加framework库中的libbz2.1.0.dylib:给nsdat

java兑现html网页的gzip解压

java实现html网页的gzip解压 在对网页抓包中发现,返回的很多网页是经过压缩的,比如访问谷歌首页,返回的头文件中包含Content-Encoding gzip 使用gzip可以省下很多网页流量,在网速一定的情况下,可以提高访问效率,我们用java访问时如何可以得到gzip的返回,并且我们如何解析返回的gzip呢? 我们以访问http://www.baidu.com/为例我们用URL的openStream方法直接访问时并不返回gzip压缩数据,这是因为时候返回gzip需要判断浏览器是否支持

http数据流 gzip解压方法分析

gzip压缩的http数据流都包含 “Content-Encoding: gzip\r\n\r\n” : 紧跟其后的是压缩后的数据长度,占三个字节,然后是 \r\n ,占两个字节: 再往后就是压缩数据了,可以直接将 压缩数据 copy到文件里用gz解压缩软件可以直接解压缩. 在代码中只需要调用对应的解压缩接口应该就可以解压缩了,后续感兴趣的可以尝试一下. ps: 分析数据包建议可采用wireshark协议分析软件,自己设计的协议可以用lua语言编写解析脚本进行测试工作也挺方便的. http数据流

【菜鸟学Linux】gzip解压报错:gzip: stdin has more than one entry--rest ignored

lz Linux菜鸟一枚,今天想用gzip解压下压缩包,据说Linux默认不支持rar压缩,需要安装组件. so,lz我特意zip压缩了一个文件上传上去解压,记得之前测试的时候都ok的正常解压:tar -zxvf  XXX.zip 不知道今天啥情况..难道是我之前重新搭建过环境的原因,用tar就报错.. 然后lz我多方查证,终于解决了问题,特来分享,不喜勿喷! 解决方法:改用unzip解压:unzip XXX.zip 报错原因:ar命令也是调用了gunzip命令的 [菜鸟学Linux]gzip解

iOS文件解压&&数据加密

一文件压缩.这里我们需要一个第三方SSZipArchive(需要添加libz.td) 1 #import "ViewController.h" 2 #import "SSZipArchive.h" 3 4 @interface ViewController () 5 6 @end 7 8 @implementation ViewController 9 10 - (void)viewDidLoad { 11 [super viewDidLoad]; 12 // Do

gzip解压压缩的字符串数据

import urllib2 from StringIO import StringIO import gzip def loadData(url): request = urllib2.Request(url) request.add_header('Accept-encoding', 'gzip') response = urllib2.urlopen(request) if response.info().get('Content-Encoding') == 'gzip': print '

VB6解压GZIP和C#解压GZIP

VB进行GZIP解压的,DLL是系统的,如果没有点击这里下载 1 Option Explicit 2 'GZIP API 3 '-------------------------------------------------- 4 Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length A

php对gzip文件或者字符串解压实例参考

要采集一个网站,目标站采用了gzip压缩传输网页,本来应该只要发送一个http头 Accept-Encoding: identity或者干脆不发送这个头等,就可以使目标站返回没有经过gzip压缩的页面了,不过很不幸,目标站无视客户端的请求,仍然返回gzip数据,造成乱码. 其实php对gzip解压很简单,用内置的gzdecode函数就可以了,不过很可惜我配置了半天也无法支持gzdecode函数,所以只好变通一下: 复制代码 代码如下: if (!function_exists('gzdecode

Gzip压缩与解压

压缩:将指定的原字符串用 gzip 算法压缩,然后以 BASE64 编码 解压:将指定的 BASE64 编码的字符串用 gzip 解压,返回原字符串 原字符串为 UTF-8 编码. Java 版本 导入包 基本都是 JDK 内置的包,BASE64 部分可能需要替换一下(JDK8 已经自带 BASE64). import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExce