java ios压缩,iOS中的GZIP压缩

项目中有个需求要上传用户的很多信息,考虑到接口响应速度后端同学提出了要对数据进行GZIP压缩。

关于iOS端的GZIP压缩,这是我目前在github上找到的star数最多的一个。GZIP github地址。

手动导入的时候,记得在Targets--Build Phases--Link Binary With Libraries中添加libz.1.2.5.tbd。

接下来我们来看看GZIP到底能压缩多少。

NSMutableDictionary *dic = [NSMutableDictionary dictionary];

for (int i = 0; i < 9999 ; i++) { // 模拟一万条简单的数据

NSString *key = [NSString stringWithFormat:@"爱新觉罗----%d",i];

[dic setObject:@"8008208820" forKey:key];

}

NSData *contactData = [NSJSONSerialization dataWithJSONObject:dic options:NSJSONWritingPrettyPrinted error:nil];

NSLog(@"contactData is %ld 字节", (long)contactData.length);

NSData *zipData = [contactData gzippedData];

NSLog(@"zipData is %ld 字节", (long)zipData.length);

b78402ab9a10?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

打印结果

经过GZIP压缩后,字节大小缩小幅度很大。但是压缩后的data是无法通过- (nullable instancetype)initWithData:(NSData *)data encoding:(NSStringEncoding)encoding; 得到string的,该方法得到的string为nil。因为压缩后导致data里的格式发生了变化。

这个时候我们再来看java中对于压缩的数据解压缩的方法。

/**

* 使用zip进行解压缩

* @param compressedStr 压缩后的文本

* @return 解压后的字符串

*/

public static final String unzip(String compressedStr) {

if (compressedStr == null) {

return null;

}

ByteArrayOutputStream out = null;

ByteArrayInputStream in = null;

ZipInputStream zin = null;

String decompressed = null;

try {

byte[] compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);

out = new ByteArrayOutputStream();

in = new ByteArrayInputStream(compressed);

zin = new ZipInputStream(in);

zin.getNextEntry();

byte[] buffer = new byte[1024];

int offset = -1;

while ((offset = zin.read(buffer)) != -1) {

out.write(buffer, 0, offset);

}

decompressed = out.toString();

} catch (IOException e) {

decompressed = null;

} finally {

if (zin != null) {

try {

zin.close();

} catch (IOException e) {

}

}

if (in != null) {

try {

in.close();

} catch (IOException e) {

}

}

if (out != null) {

try {

out.close();

} catch (IOException e) {

}

}

}

return decompressed;

}

java的代码没法完全看懂,但是可以看到byte[] compressed = new sun.misc.BASE64Decoder().decodeBuffer(compressedStr);这句。后端接收到我们压缩后的string先是用base64转,也就是我们压缩后要传一个base64的字符串给后端。

那么最后,只要将zipData转成base64的string给后台即可。[zipData base64EncodedStringWithOptions:0];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值