文档章节

object-c 内存里面压缩与解压缩的函数

S
 Snaiper
发布于 2013/12/17 11:34
字数 773
阅读 1381
收藏 6

1,nsdata

包含 libz.dylib库文件

/** 
    @file LFCGzipUtility.h 
    @author Clint Harris (www.clintharris.net) 
      
    Note: The code in this file has been commented so as to be compatible with 
    Doxygen, a tool for automatically generating HTML-based documentation from 
        source code. See http://www.doxygen.org for more info. 
*/  
#import <Foundation/Foundation.h>  
#import "zlib.h"

@interface LFCGzipUtility : NSObject
{

}  

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

+(NSData*) ungzipData:(NSData *)compressedData;
   
@end 
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


 /**

  @file LFCGzipUtility.m 
  @author Clint Harris (www.clintharris.net) 
  
  Note: The code in this file has been commented so as to be compatible with 
  Doxygen, a tool for automatically generating HTML-based documentation from 
  source code. See http://www.doxygen.org for more info. 
  */  
   
#import "LFCGzipUtility.h"  
   
@implementation LFCGzipUtility


+(NSData*) gzipData: (NSData*)pUncompressedData  
{  
     if (!pUncompressedData || [pUncompressedData length] == 0)  
     {  
         NSLog(@"%s: Error: Can't compress an empty or null NSData object.", __func__);  
         return nil;  
     }  

     z_stream zlibStreamStruct;  
     zlibStreamStruct.zalloc    = Z_NULL; // Set zalloc, zfree, and opaque to Z_NULL so  
     zlibStreamStruct.zfree     = Z_NULL; // that when we call deflateInit2 they will be  
     zlibStreamStruct.opaque    = Z_NULL; // updated to use default allocation functions.  
     zlibStreamStruct.total_out = 0; // Total number of output bytes produced so far  
     zlibStreamStruct.next_in   = (Bytef*)[pUncompressedData bytes]; // Pointer to input bytes  
     zlibStreamStruct.avail_in  = [pUncompressedData length]; // Number of input bytes left to process  
    
     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);  
         [errorMsg release];  
         return nil;  
     }  
  
     // Create output memory buffer for compressed data. The zlib documentation states that  
     // destination buffer size must be at least 0.1% larger than avail_in plus 12 bytes.  
     NSMutableData *compressedData = [NSMutableData dataWithLength:[pUncompressedData length] * 1.01 + 12];  
   
     int deflateStatus;  
     do  
     {  
         // Store location where next byte should be put in next_out  
         zlibStreamStruct.next_out = [compressedData mutableBytes] + zlibStreamStruct.total_out;  
  
         // Calculate the amount of remaining free space in the output buffer  
         // by subtracting the number of bytes that have been written so far  
        // from the buffer's total capacity  
         zlibStreamStruct.avail_out = [compressedData length] - zlibStreamStruct.total_out;  
         deflateStatus = deflate(&zlibStreamStruct, Z_FINISH);  
   
     } while ( deflateStatus == Z_OK );        
  
     // Check for zlib error and convert code to usable error message if appropriate  
     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);  
         [errorMsg release];  
   
         // Free data structures that were dynamically created for the stream.  
         deflateEnd(&zlibStreamStruct);  
   
         return nil;  
     }  
     // Free data structures that were dynamically created for the stream.  
     deflateEnd(&zlibStreamStruct);  
     [compressedData setLength: zlibStreamStruct.total_out];  
     NSLog(@"%s: Compressed file from %d KB to %d KB", __func__, [pUncompressedData length]/1024, [compressedData length]/1024);  
   
     return compressedData;  
}  

+(NSData *)ungzipData:(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];  
    }  
    return nil;    
}

@end 


////测试demo

       UIImageView* imageviewBK = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)];
        UIImage* myimages = [UIImage imageNamed:@"BK.png"];
        NSData* bkData = UIImagePNGRepresentation(myimages);
        NSLog(@"----%d",[bkData length]);
        
        NSData* bktwoData =  [LFCGzipUtility gzipData:bkData];
        NSLog(@"-22222222---%d",[bktwoData length]);
        
        NSData* bkthreeData = [LFCGzipUtility ungzipData:bktwoData];
        NSLog(@"-333333333---%d",[bkthreeData length]);
        imageviewBK.image = [UIImage imageNamed:@"BK.png"];
        [self addSubview:imageviewBK];

        [imageviewBK release];


2,nsstring

#import "zlib.h"

@implementation NSString (Gzip)

- (NSData *)compress
{
    size_t len = [self length];
    size_t bufLen = (len + 12) ;
    u_char *buf = (u_char *)malloc(bufLen);
    if (buf == NULL)

{
   
        return nil;
    }
    int err = compress(buf, &bufLen, (u_char *)[[self dataUsingEncoding:NSUTF8StringEncoding] bytes], len);
    if (err != Z_OK)

{
        free(buf);
        return nil;
    }
    
    NSData *rtn = [[[NSData alloc] initWithBytes:buf length:bufLen] autorelease];
    free(buf);
    
    return rtn;
}

@end


© 著作权归作者所有

共有 人打赏支持
S
粉丝 13
博文 100
码字总数 135194
作品 0
深圳
私信 提问
开发手记OSSC-阿里云开发存储服务(OSS)的C SDK

OSSC(Aliyun Open Storage Service C SDK)是我和实验室@王维同学在2012首届阿里云开发者大赛中的参赛项目(http://2012.aliyun.com),我们作品提交是在10月2号,但是11月8号才揭晓最终结果...

大卷卷
2012/10/22
0
0
阿里云开放存储服务的C语言SDK--OSSC

OSSC(Aliyun Open Storage Service C SDK)为阿里云开放存储服务(OSS)提供了一套完整易用的C SDK。 OSSC完全采用C语言开发,并实现了类似面向对象的调用方式,遵循了良好的编码规范,目前O...

大卷卷
2012/10/22
4.2K
0
asp.net利用RAR实现文件压缩解压缩【月儿原创】

asp.net利用RAR实现文件压缩解压缩 作者:清清月儿 主页:http://blog.csdn.net/21aspnet/ 时间:2007.6.13 如果服务器上安装了RAR程序,那么asp.net可以调用RAR实现文件压缩与解压缩。 不过...

晨曦之光
2012/03/09
91
0
基于hi-linu基于hi-linux的busybox命令学习-bunzip2、bzip2、compress

bunzip2 功能说明:.bz2文件的解压缩程序。.bz2文件的解压缩程序。 格式:bunzip2 [-fkLsvV][.bz2压缩文件]bunzip2 [-fkLsvV][.bz2压缩文件] 主要参数: -f或--force  解压缩时,若输出的文...

GIT-YCJ
2015/10/27
1
0
迅为iTOP-4412开发板Ubuntu操作系统烧写方法

本文转自:http://www.topeetboard.com Ubuntu系统烧写硬件平台:iTOP4412开发板 需要准备:串口线、读卡器、一张SD卡最好是2G(自备)、另外一张卡(大于等于2G都可以,也可以使用U盘) 软件平...

歌之王子殿下
2015/12/03
590
0

没有更多内容

加载失败,请刷新页面

加载更多

lua中.和:的区别

lua中.和:都可以用于方法的声明和调用。和table配合使用。 :和.最大的不同点,就是:会把调用者自身,传入到函数中。 如下代码: c = {a=1,b=2}function c:foo1()print(self.a,self.b)...

乐_然
18分钟前
1
0
CentOS7 NTP客户端和服务器安装和使用

本文测试环境如下: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@localhost ~]# [root@localhost ~]# yum install ntp#等待安装完成......

白豆腐徐长卿
29分钟前
7
0
Tensorflow源码解析3 -- TensorFlow核心对象 - Graph

1 Graph概述 计算图Graph是TensorFlow的核心对象,TensorFlow的运行流程基本都是围绕它进行的。包括图的构建、传递、剪枝、按worker分裂、按设备二次分裂、执行、注销等。因此理解计算图Gra...

阿里云官方博客
34分钟前
3
0
网站加载不了 图片

公司测试环境,某网站图片加载不了 nginx 配置 server { listen 80;listen 443 ssl;charset utf-8;root /var/www/html/ad-server; index index.html index.htm...

Linux_Anna
36分钟前
2
0
亿级曝光品牌视频的幕后设定

本文由云+社区发表 作者:腾讯ISUX 项目背景 2019年春节期间,QQ红包运营活动进行了全新改版,将卡券福利、现金奖励打包成福袋形式,并通过年俗小游戏及共享福袋的玩法吸引更多用户参与。在点...

腾讯云加社区
38分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部