- 浏览: 38895 次
- 性别:
- 来自: 北京
最新评论
to allow zlib compression/decompression of NSData. But a couple months ago I went looking for similar code to allow gzip compression/decompression. At the time I didn't find any, and found myself wading through the zlib documentation and header files until I came up with a solution. I've recently noticed that someone else on CocoaDev has also mentioned the solution, but it looks like they didn't fully implement a deflate version of it. So, without further ado, here is an NSData category that adds support for gzip compression and decompression:
@interface NSData (DDData)
// gzip compression utilities
- (NSData *)gzipInflate;
- (NSData *)gzipDeflate;
@end
-----------------------------------------
#include
@implementation NSData (DDData)
- (NSData *)gzipInflate
{
if ([self length] == 0) return self;
unsigned full_length = [self length];
unsigned half_length = [self length] / 2;
NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];
BOOL done = NO;
int status;
z_stream strm;
strm.next_in = (Bytef *)[self bytes];
strm.avail_in = [self 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;
}
- (NSData *)gzipDeflate
{
if ([self length] == 0) return self;
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.total_out = 0;
strm.next_in=(Bytef *)[self bytes];
strm.avail_in = [self 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 = [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];
}
@end
转自 http://hi.baidu.com/leonqgl/blog/item/abe7eec7f9ac4dc6d10060b1.html
@interface NSData (DDData)
// gzip compression utilities
- (NSData *)gzipInflate;
- (NSData *)gzipDeflate;
@end
-----------------------------------------
#include
@implementation NSData (DDData)
- (NSData *)gzipInflate
{
if ([self length] == 0) return self;
unsigned full_length = [self length];
unsigned half_length = [self length] / 2;
NSMutableData *decompressed = [NSMutableData dataWithLength: full_length + half_length];
BOOL done = NO;
int status;
z_stream strm;
strm.next_in = (Bytef *)[self bytes];
strm.avail_in = [self 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;
}
- (NSData *)gzipDeflate
{
if ([self length] == 0) return self;
z_stream strm;
strm.zalloc = Z_NULL;
strm.zfree = Z_NULL;
strm.opaque = Z_NULL;
strm.total_out = 0;
strm.next_in=(Bytef *)[self bytes];
strm.avail_in = [self 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 = [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];
}
@end
转自 http://hi.baidu.com/leonqgl/blog/item/abe7eec7f9ac4dc6d10060b1.html
发表评论
-
IOS
2012-06-08 18:08 2186转自 http://site.douban.com/ ... -
iPhone4文件结构分析列表
2012-06-06 18:25 11、 【/Applications】 ... -
IOS 入门开发之使用Xcode4制作静态库详解
2012-05-23 16:40 1205雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原 ... -
NSError code错误列表信息(NSFileManage、NSURL...)
2012-05-14 13:05 2605NSError codes in the Cocoa erro ... -
iOS4中Core Motion框架的介绍和使用
2012-04-18 20:47 932http://www.kunli.info/2010/07/3 ... -
iOS5新开发的API总述——WWDC 2011
2012-03-23 13:03 1833转自 http://alloc.sinaapp.com ... -
中文版多线程编程指南
2012-03-19 19:33 966转自http://www.cocoachina.com/iph ... -
iPhone 路径大全
2012-03-13 11:41 9751、【/Applications】 常用 ... -
App Store审核指南
2012-03-08 19:19 965前言 感谢您付出宝 ... -
iOS设备型号与产品名称的对应
2012-03-07 21:47 2364"iPhone1,1" => &qu ... -
iOS平台开发者总结出的宝贵上架经验
2012-03-06 16:06 1108以下是许多iOS平台开发者总结出的宝贵上架经验: 基本 ... -
版本控制清除所有.svn目录
2012-02-29 18:04 1576删除这些目录是很简单的,命令如下find . -type d ... -
UIView的一些基本方法理解:loadView、viewDidLoad、viewDidUnload、viewWillAppear、viewWillDisapp
2012-02-29 15:51 1820对于其它几个基本方法就不那么常用了,为了更好地编程使用这些方法 ... -
iphone音乐播放
2012-02-28 14:20 1293在 iPhone 应用或者是游戏的开发过程中,对声音的支持是必 ... -
Zlib的deflate, z_stream结构的使用
2012-02-20 22:52 3689Zlib的deflate, z_stream结构的 ... -
iphone通讯录AddressBook.framework和AddressBookUI.framework的应用
2012-02-02 12:26 3197通讯录中联系人相关的应用iPhone提供了两个框架:Ad ...
相关推荐
在这个"易语言源码易语言GZIP解压缩源码.rar"压缩包中,包含了使用易语言实现GZIP文件解压缩的相关源代码,对于学习易语言以及理解文件压缩技术的开发者来说是一份宝贵的资源。 GZIP是一种广泛使用的数据压缩格式,...
Gzip 文件解压缩 解压缩Gzip文件时,首先要识别文件头,然后使用DEFLATE算法对压缩数据进行逆向处理,恢复原始数据。在Windows系统中,可以使用命令行工具`gzip -d`或图形界面工具如7-Zip进行解压。在编程环境中,...
标题中的“利用JAVASCRIPT实现GZIP压缩与解压缩”指的是在JavaScript环境中,我们可以使用原生或第三方库来处理GZIP格式的压缩和解压缩操作。GZIP是一种广泛使用的数据压缩格式,常用于减少网络传输的数据量,尤其是...
2. **文件解压缩**:读取.gz格式的压缩文件,使用gzip库解压缩,将原始数据恢复并写回到新的文件中。 3. **内存数据压缩与解压缩**:如果数据存储在内存中,同样可以使用gzip库进行压缩和解压缩操作,无需先写入磁盘...
当我们谈论“iphone文件解压缩zip-gzip”时,我们实际上在讨论两种不同的文件压缩格式及其在iOS设备上的应用。 首先,`zip`是一种广泛使用的文件归档格式,它允许将多个文件和目录打包成一个单一的可压缩文件。Zip...
在IT行业中,文件压缩与解压缩是日常工作中常见的操作,特别是在数据传输、存储优化和软件分发等领域。这里我们主要探讨的是一个简单的工具类,它支持zip、rar、tar等多种格式的压缩和解压缩功能,并且经过实际测试...
本篇文章将详细探讨如何在VS2005环境下使用GZip进行文件的解压缩。 一、GZip压缩原理 GZip是一种基于DEFLATE算法的文件压缩格式,它通过消除文件中的冗余数据和重复模式来减小文件大小。DEFLATE算法结合了LZ77(一...
易语言GZIP解压缩源码提供了在易语言环境下处理GZIP文件的解决方案,使开发者能够便捷地在自己的应用程序中实现文件的压缩和解压缩功能。掌握这些知识对于任何IT专业人士来说都是一个重要的技能点。
标题中的“gzip解压缩模块”指的是在编程领域中用于处理gzip格式压缩文件的软件组件或库。gzip是一种广泛使用的数据压缩格式,特别是在网络传输和存储大量文本数据时,它可以显著减小文件大小,提高传输效率。这个...
gzip.dll 文件压缩解压缩需要的必要文件文件压缩解压缩需要的必要文
4. 写回原始文件:如果目标是解压缩后保存为原始文件,可以使用`fwrite()`将解压缩的数据写入目标文件。 在poetryfem这个项目中,可能包含了一个C语言实现的gzip工具,文件名为“gzip”,它实现了这些功能。开发者...
2. **解压缩**:使用`pako.gunzip()`方法,将已压缩的数据作为输入,它会返回原始的解压缩数据。例如: ```javascript var decompressed = pako.gunzip(compressed); ``` 对于中文字符的处理,通常需要确保数据...
2. **压缩与解压缩**:压缩文件是为了减小文件大小,节省存储空间和加快传输速度。解压缩则是将压缩后的文件恢复为原始状态。PHP提供了多种处理压缩和解压缩的函数或扩展。 3. **zip**:zip是一种常用的文件压缩...
在Java编程语言中,文件的压缩与解压缩是常见的数据处理操作,特别是在数据传输、存储优化和备份场景中。本实践项目围绕这个主题展开,包括源代码和相关的论文,为学习者提供了深入理解和应用Java压缩库的机会。以下...
在易语言环境下,开发者可以使用此模块通过编写调用相应函数的代码,实现对gzip文件的解压缩操作。源码可能包含如下关键函数: - `初始化解压缩`:分配必要的内存,准备解压缩。 - `开始解压缩`:读取gzip文件,...
本篇将深入探讨Gzip文件压缩的相关知识点,结合提供的标题“Gzip文件压缩实例”以及标签“源码”和“工具”,我们将分析Gzip的原理、使用方法、源码解析以及相关工具的运用。 1. **Gzip原理** Gzip基于DEFLATE算法...
在恢复备份时,再将这些压缩文件解压缩,还原原始数据。 在标签中提到了“源代码”,这意味着可能包含的是使用PB编写的压缩和解压缩功能的具体实现。通常,这样的源代码可能会包括以下几个部分: - **压缩模块**:...
本文将详细讲解如何在C#环境中使用GZIP库来实现文件的解压缩,特别针对使用Visual Studio 2005开发环境的情况。 首先,我们要了解GZIP的基本原理。GZIP采用的是DEFLATE算法,该算法结合了LZ77(一种字典压缩方法)...
本资源包“文件GZip压缩AES加密反向解密解压缩代码和jar”提供了完整的Java实现,使得开发者能够方便地对文件进行GZip压缩、AES加密,以及后续的解密和解压缩操作。下面将详细解释这些技术及其应用。 首先,GZip...
本文将深入探讨C#语言中用于Zip和Gzip压缩的相关知识,以及如何在Visual Studio 2008环境下进行解压缩操作。 首先,让我们理解Zip和Gzip两种压缩格式。Zip是一种广泛使用的文件压缩格式,它能将多个文件或目录打包...