iOS/MAC 数据压缩与解压缩及常用算法 LZMA、ZLIB

苹果提供的常用的数据压缩算法LZMA、ZLIB、LZ4等;

这三种算法也是苹果建议的,可跨平台使用;

定义如下:

1
2
3
4
5
6
7
8
9
/* Commonly-available encoders */
COMPRESSION_LZ4     = 0x100,       // available starting OS X 10.11, iOS 9.0
COMPRESSION_ZLIB    = 0x205,       // available starting OS X 10.11, iOS 9.0
COMPRESSION_LZMA    = 0x306,       // available starting OS X 10.11, iOS 9.0
 
COMPRESSION_LZ4_RAW = 0x101,       // available starting OS X 10.11, iOS 9.0
 
/* Apple-specific encoders */
COMPRESSION_LZFSE    = 0x801,      // available starting OS X 10.11, iOS 9.0

 

适用于有大文件数据上传下载,节省流量可以考虑使用;

使用说明:

1. 需要引用头文件

1
#include "compression.h"

2. 数据压缩示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (void)testCompress{
     
     
    NSData *src = [NSData dataWithContentsOfFile:@"/Users/cocoajin/Desktop/src.txt"];
     
    NSLog(@"src: %ld",src.length);
     
    uint8_t *dstBuffer = (uint8_t *)malloc(src.length);
    memset(dstBuffer, 0, src.length);
     
    size_t compressResultLength = compression_encode_buffer(dstBuffer, src.length, [src bytes], src.length, NULL, COMPRESSION_LZMA);
     
    if (compressResultLength > 0) {
        NSData *newData = [NSData dataWithBytes:dstBuffer length:compressResultLength];
        [newData writeToFile:@"/Users/cocoajin/Desktop/compress.data" atomically:YES];
        NSLog(@"com: %ld",compressResultLength);
        NSLog(@"com: %.2f",(src.length-compressResultLength)/(float)src.length);
         
    }else{
        NSLog(@"compress error!");
    }
     
    free(dstBuffer);
}

  

3. 数据解压缩示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- (void)testDeCompress{
    NSData *src = [NSData dataWithContentsOfFile:@"/Users/cocoajin/Desktop/compress.data"];
     
    NSLog(@"src: %ld",src.length);
    uint8_t *dstBuffer = (uint8_t *)malloc(1024*1024*10);
    memset(dstBuffer, 0, src.length);
     
    size_t decompressLen = compression_decode_buffer(dstBuffer,1024*1024*10,src.bytes,src.length,NULL,COMPRESSION_LZMA);
     
    if (decompressLen > 0) {
        NSData *newData = [NSData dataWithBytes:dstBuffer length:decompressLen];
        [newData writeToFile:@"/Users/cocoajin/Desktop/decompress.txt" atomically:YES];
        NSLog(@"com: %ld",decompressLen);
         
    }else{
        NSLog(@"decompressLen error!");
    }
     
    free(dstBuffer);
}

 

4. 实际测对一个1.9M的txt小说文件压缩,压缩以后大小为0.8m,压缩效果还是很明显的;

 

  

 

posted @   cocoajin  阅读(2327)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示