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;
}
这个压缩实质上是二进制压缩的文件,可以对任何二进制文件进行压缩.
iOS 数据压缩与解压的更多相关文章
- 【cocos2d-x 手游研发小技巧(8)通讯的数据压缩与解压 】
今天说一下手机游戏通讯协议中的数据问题,大量的数据将给服务器端和客户端带来很大的压力,一般来说. 转载请注明出处:http://www.cnblogs.com/zisou/p/cocos2dxJQ-8 ...
- iOS关于rar解压第三方库Unrar4iOS使用总结
作者最近的公司项目要做实现rar解压的功能,在网上找了很久貌似关于rar解压的资料很少,不过有很多人推荐一个名叫“Unrar4iOS”的第三方开源框架,于是下载并尝试使用发现该开源框架并在使用过程中发 ...
- ios的图片解压
YYKit SDWebImage FLAnimatedImage YYKit YYCGImageCreateDecodedCopy YYImageCoder 1 2 3 4 5 6 7 8 9 10 ...
- iOS 解压打包静态库命令
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Hannotate SC" } p.p2 { margin: 0.0px ...
- iOS开发中的压缩以及解压
事实上,在iOS开发中,压缩与解压,我都是采用第三方框架SSZipArchive实现的 gitHub地址: https://github.com/ZipArchive/ZipArchive 上面有 ...
- iOS文件解压&&数据加密
一文件压缩.这里我们需要一个第三方SSZipArchive(需要添加libz.td) #import "ViewController.h" #import "SSZipA ...
- iOS - File Archive/UnArchive 文件压缩/解压
1.ZipArchive 方式 ZipArchive 只能对 zip 类文件进行压缩和解压缩 GitHub 网址:https://github.com/ZipArchive/ZipArchive Zi ...
- [iOS 多线程 & 网络 - 2.4] - 大文件下载 (边下边写/暂停恢复下载/压缩解压zip/多线程下载)
A.需求 边下边写入硬盘 显示下载进度 暂停/恢复 下载 解压文件 多线程下载 B.基本知识 1.小文件下载 如果文件比较小,下载方式会比较多直接用NSData的+ (id)dataWithCon ...
- iOS开发之zip文件解压
今天给大家分享zip解压到指定目录 首先需要下载ZipArchive文件 下载地址:https://pan.baidu.com/s/1S6qYicoVr3M3hI0M1EW2Bw 将下载的文件导入工程 ...
随机推荐
- c#读excel 不用office组件
某日笔者写了个导入导出excel的小程序,拿给别人用时,别人说程序有问题读不了. 究其原因发现原来是using Microsoft.Office.Interop.Excel;引用出错.发现他装的off ...
- Maven打包可执行Jar的几种方法
http://m.blog.csdn.net/article/details?id=51871705
- 拷贝内容到eclipse中导致JSP的auto-completion不工作
刚才在编辑JSP文件,有一些东西我懒得敲了,就把一些代码里面拷贝到eclipse的editor中,结果你猜怎么,拷贝进去以后,jsp的auto-completion居然不工作了!(即<%%> ...
- 使用 FreeRTOS 时注意事项总结(基础篇教程完结)
以下转载自安富莱电子: http://forum.armfly.com/forum.php FreeRTOS 的初始化流程推荐的初始化流程如下,本教程配套的所有例子都是采用的这种形式,当然,不限制必须 ...
- hdu2609(最小表示法)
题意:有n个环形字符串,一个环形字符串移动会形成不能的字符串,我们把它们看作同一串字符串,求有多少个不同的字符串....... 思路:用最小表示发将一个环形串的最小字典序找出来,然后让这个环形串按照这 ...
- python学习笔记(16)--django的安装
说明: 1. 直接在cmd输入: pip install Django==1.10.6前提是安装了python,pip并添加了环境变量 2. http://www.lfd.uci.edu/~gohlk ...
- C++笔记 4
1.类和对象 类就是对对象的描述,主要从属性和行为两个方面描述. 对于属性一般作成private , 行为作为public 函数 (1)构造函数,初始化所有的成员变量,系统自动调用,可以重 ...
- 一款基于jquery和css3实现的摩天轮式分享按钮
之前分享了很多css3实现的按钮.今天要给大家带来一款基于jquery和css3实现的摩天轮式分享按钮.这款分享按钮页面底部有一个toggle按钮,单击该按钮,摩天轮按钮以动画的形式出现,各个分享按钮 ...
- Google Guava 库用法整理<转>
参考: http://codemunchies.com/2009/10/beautiful-code-with-google-collections-guava-and-static-imports- ...
- m个苹果放在n个盘子里面有多少种放法?(动态规划)
m个苹果放在n个盘子里面有多少种放法?(动态规划) 实现代码如下: #include <iostream> using namespace std; int s(int m ,int n) ...