iOS 数据压缩与解压

转自: http://blog.csdn.net/dkq972958298/article/details/53321804

在实际开发中,我们经常要对比较大的数据进行压缩后再上传服务器,下面是我在项目中压缩数据时所使用的压缩方法:

对数据进行压缩:

zipAndUnzip *zipAnd = [[zipAndUnzip alloc] init];

NSString *str = @"六六六六了还是德国大使馆和低俗化工及第三方换个撒点恢复健康的十分好的设计哈佛的号发的撒开了凤凰健康的十分健康的沙发";

NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

NSData *dataDeflate = [zipAnd gzipDeflate:data];

对数据进行解压:

NSData *dataInflate =  [zipAnd gzipInflate:dataDeflate];

NSString *aString = [[NSString alloc] initWithData:dataInflate encoding:NSUTF8StringEncoding];

压缩的方法是:

    //压缩
    - (NSData *)gzipDeflate:(NSData*)data
    {
        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 = (uInt)[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 = (uInt)([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 long full_length = [data length];
        unsigned long  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 = (uInt)[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 = (uInt)([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;
    }

这个压缩实质上是二进制压缩的文件,可以对任何二进制文件进行压缩.

时间: 2024-07-28 14:47:26

iOS 数据压缩与解压的相关文章

iOS关于rar解压第三方库Unrar4iOS使用总结

作者最近的公司项目要做实现rar解压的功能,在网上找了很久貌似关于rar解压的资料很少,不过有很多人推荐一个名叫“Unrar4iOS”的第三方开源框架,于是下载并尝试使用发现该开源框架并在使用过程中发现了一些存在的问题,特在此做下总结让后来人少走些弯路. 1.不支持armv7s: 2.编译好的framework中将Unrar4iOS.h和Unrar4iOS.mm编译在内有些方法并未实现,比如-(BOOL) unrarFileTo:(NSString*) path overWrite:(BOOL)

Base64和Zip数据压缩与解压

压缩图片数据,解压图片数据public class TestZCompress {    public static void main(String[] args) {        try {            File file = new File("D://haha.jpg");            if (file.exists()) {                InputStream in = new FileInputStream("D://hah

iOS开发中的压缩以及解压

事实上,在iOS开发中,压缩与解压,我都是采用第三方框架SSZipArchive实现的 gitHub地址:   https://github.com/ZipArchive/ZipArchive 上面有详细的使用方法 因为ZipArchive不支持ARC,所以如果你的工程开启了ARC,那么就需要对ZipArchive设置一下.在ZipArchive.mm编译选项中,增加-fno-objc-arc即可. 最后,需要为工程链接libz.dylib动态链接库. 使用示范(压缩): // 获得mainBu

iOS客户端的gzip解压

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

iOS 字符串转码+解压

最近遇到这样的一个问题,从服务器上返回的字符串是经过压缩的.下面记录下解决方法 // // ViewController.m // 字符串解压缩 // // Created by 杜甲 on 14-5-8. // Copyright (c) 2014年 杜甲. All rights reserved. // #import "ViewController.h" #import "LFCGzipUtillity.h" @interface ViewController

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

iOS开发——网络编程OC篇&(八)文件压缩与解压

文件压缩与解压 一.技术方案1.第三方框架:SSZipArchive2.依赖的动态库:libz.dylib 二.压缩11.第一个方法/** zipFile :产生的zip文件的最终路径 directory : 需要进行的压缩的文件夹路径 */[SSZipArchive createZipFileAtPath:zipFile withContentsOfDirectory:directory]; 2.第一个方法/** zipFile :产生的zip文件的最终路径 files : 这是一个数组,数组

iOS多线程与网络开发之大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)

郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 如果文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额随意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源码下载:点我传送 游戏官方下载:http://dwz.cn/RwTjl 游戏视频预览:http://dwz.cn/RzHHd 游戏开发博客:http://dwz.cn/RzJzI 游戏源码传送:http://dwz.cn/Nret1 A.需求 边下边写入硬盘 显示下载进度 暂停/恢复 下载 解压文件 多线程下载 B.基本知识 1

【转】iOS开发之压缩与解压文件

ziparchive是基于开源代码”MiniZip”的zip压缩与解压的Objective-C 的Class,使用起来非常的简单方法:从http://code.google.com/p/ziparchive/ 上下载ZipArchive.zip,解压后将代码加入工程中,并且把zlib库添加到工程中使用方法:1. 压缩:ZipArchive可以压缩多个文件,只需要把文件一一addFileToZip即可. ZipArchive* zip = [[ZipArchive alloc] init]; NS