`
彡彡稻草
  • 浏览: 38792 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

gzip文件的解压缩

    博客分类:
  • IOS
阅读更多
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
分享到:
评论

相关推荐

    易语言源码易语言GZIP解压缩源码.rar

    在这个"易语言源码易语言GZIP解压缩源码.rar"压缩包中,包含了使用易语言实现GZIP文件解压缩的相关源代码,对于学习易语言以及理解文件压缩技术的开发者来说是一份宝贵的资源。 GZIP是一种广泛使用的数据压缩格式,...

    文件Gzip解压缩,vs

    Gzip 文件解压缩 解压缩Gzip文件时,首先要识别文件头,然后使用DEFLATE算法对压缩数据进行逆向处理,恢复原始数据。在Windows系统中,可以使用命令行工具`gzip -d`或图形界面工具如7-Zip进行解压。在编程环境中,...

    利用JAVASCRIPT即你想那个GZIP压缩与解压缩

    标题中的“利用JAVASCRIPT实现GZIP压缩与解压缩”指的是在JavaScript环境中,我们可以使用原生或第三方库来处理GZIP格式的压缩和解压缩操作。GZIP是一种广泛使用的数据压缩格式,常用于减少网络传输的数据量,尤其是...

    gzip 静态解压缩库c++ builder 2007版本,源代码

    2. **文件解压缩**:读取.gz格式的压缩文件,使用gzip库解压缩,将原始数据恢复并写回到新的文件中。 3. **内存数据压缩与解压缩**:如果数据存储在内存中,同样可以使用gzip库进行压缩和解压缩操作,无需先写入磁盘...

    iphone文件解压缩zip-gzip

    当我们谈论“iphone文件解压缩zip-gzip”时,我们实际上在讨论两种不同的文件压缩格式及其在iOS设备上的应用。 首先,`zip`是一种广泛使用的文件归档格式,它允许将多个文件和目录打包成一个单一的可压缩文件。Zip...

    文件压缩解压缩

    在IT行业中,文件压缩与解压缩是日常工作中常见的操作,特别是在数据传输、存储优化和软件分发等领域。这里我们主要探讨的是一个简单的工具类,它支持zip、rar、tar等多种格式的压缩和解压缩功能,并且经过实际测试...

    使用GZip解压缩文件.rar

    本篇文章将详细探讨如何在VS2005环境下使用GZip进行文件的解压缩。 一、GZip压缩原理 GZip是一种基于DEFLATE算法的文件压缩格式,它通过消除文件中的冗余数据和重复模式来减小文件大小。DEFLATE算法结合了LZ77(一...

    GZIP解压缩.rar

    易语言GZIP解压缩源码提供了在易语言环境下处理GZIP文件的解决方案,使开发者能够便捷地在自己的应用程序中实现文件的压缩和解压缩功能。掌握这些知识对于任何IT专业人士来说都是一个重要的技能点。

    gzip解压缩模块.rar

    标题中的“gzip解压缩模块”指的是在编程领域中用于处理gzip格式压缩文件的软件组件或库。gzip是一种广泛使用的数据压缩格式,特别是在网络传输和存储大量文本数据时,它可以显著减小文件大小,提高传输效率。这个...

    gzip.dll 文件解压缩必要dll

    gzip.dll 文件压缩解压缩需要的必要文件文件压缩解压缩需要的必要文

    gzip.rar_C gzip源码_c语言gzip_gzip压缩_gzip解压_poetryfem

    4. 写回原始文件:如果目标是解压缩后保存为原始文件,可以使用`fwrite()`将解压缩的数据写入目标文件。 在poetryfem这个项目中,可能包含了一个C语言实现的gzip工具,文件名为“gzip”,它实现了这些功能。开发者...

    pako gzip 压缩和解压缩(支持中文)

    2. **解压缩**:使用`pako.gunzip()`方法,将已压缩的数据作为输入,它会返回原始的解压缩数据。例如: ```javascript var decompressed = pako.gunzip(compressed); ``` 对于中文字符的处理,通常需要确保数据...

    php zip gzip tar..压缩解压缩类

    2. **压缩与解压缩**:压缩文件是为了减小文件大小,节省存储空间和加快传输速度。解压缩则是将压缩后的文件恢复为原始状态。PHP提供了多种处理压缩和解压缩的函数或扩展。 3. **zip**:zip是一种常用的文件压缩...

    JAVA文件压缩与解压缩实践(源代码+论文)

    在Java编程语言中,文件的压缩与解压缩是常见的数据处理操作,特别是在数据传输、存储优化和备份场景中。本实践项目围绕这个主题展开,包括源代码和相关的论文,为学习者提供了深入理解和应用Java压缩库的机会。以下...

    易语言源码易语言gzip解压缩模块源码.rar

    在易语言环境下,开发者可以使用此模块通过编写调用相应函数的代码,实现对gzip文件的解压缩操作。源码可能包含如下关键函数: - `初始化解压缩`:分配必要的内存,准备解压缩。 - `开始解压缩`:读取gzip文件,...

    Gzip文件压缩 实例

    本篇将深入探讨Gzip文件压缩的相关知识点,结合提供的标题“Gzip文件压缩实例”以及标签“源码”和“工具”,我们将分析Gzip的原理、使用方法、源码解析以及相关工具的运用。 1. **Gzip原理** Gzip基于DEFLATE算法...

    pb实现压缩与解压缩

    在恢复备份时,再将这些压缩文件解压缩,还原原始数据。 在标签中提到了“源代码”,这意味着可能包含的是使用PB编写的压缩和解压缩功能的具体实现。通常,这样的源代码可能会包括以下几个部分: - **压缩模块**:...

    C#使用GZIP解压缩

    本文将详细讲解如何在C#环境中使用GZIP库来实现文件的解压缩,特别针对使用Visual Studio 2005开发环境的情况。 首先,我们要了解GZIP的基本原理。GZIP采用的是DEFLATE算法,该算法结合了LZ77(一种字典压缩方法)...

    文件GZip压缩AES加密反向解密解压缩代码和jar

    本资源包“文件GZip压缩AES加密反向解密解压缩代码和jar”提供了完整的Java实现,使得开发者能够方便地对文件进行GZip压缩、AES加密,以及后续的解密和解压缩操作。下面将详细解释这些技术及其应用。 首先,GZip...

    Zip和Gzip解压缩

    本文将深入探讨C#语言中用于Zip和Gzip压缩的相关知识,以及如何在Visual Studio 2008环境下进行解压缩操作。 首先,让我们理解Zip和Gzip两种压缩格式。Zip是一种广泛使用的文件压缩格式,它能将多个文件或目录打包...

Global site tag (gtag.js) - Google Analytics