bzip2压缩和解压缩
最近做项目遇到了个难题,项目中要用到数据压缩,和普通的文件的压缩和解压缩不同,这里直接对数据比如NSData ,NSString 等类型的数据进行压缩,遇到这个问题首先在网上找了好多文章,比如gitHub上,一开始我很快就找到了一片关于解压缩的代码,代码链接分享给大家 https://github.com/dingtianran/LibBzip2
可是,这个例子支持解压缩,不支持数据压缩,那怎么办呢,又纠结了好长时间,后来终于找到了一篇文章就是针对解决这个问题的,把链接分享给大家:
我还是把代码粘贴一下吧,防止大家找不到位置:(注意在使用时,需要导入libbz2.1.0.dylib库,在使用的地方导入头文件 #import "bzlib.h")
+ (NSData *)bzip2:(NSData*)data
{
int bzret, buffer_size = 1000000;
bz_stream stream = { 0 };
stream.next_in = (char*)[data bytes];
stream.avail_in = [data length];
unsigned int compression = 9; // should be a value between 1 and 9 inclusive
NSMutableData * buffer = [NSMutableData dataWithLength:buffer_size];
stream.next_out = [buffer mutableBytes];
stream.avail_out = buffer_size;
NSMutableData * compressed = [NSMutableData data];
BZ2_bzCompressInit(&stream, compression, 0, 0);
@try {
do {
bzret = BZ2_bzCompress(&stream, (stream.avail_in) ? BZ_RUN : BZ_FINISH);
if (bzret != BZ_RUN_OK && bzret != BZ_STREAM_END)
@throw [NSException exceptionWithName:@"bzip2" reason:@"BZ2_bzCompress failed" userInfo:nil];
[compressed appendBytes:[buffer bytes] length:(buffer_size - stream.avail_out)];
stream.next_out = [buffer mutableBytes];
stream.avail_out = buffer_size;
} while(bzret != BZ_STREAM_END);
}
@finally {
BZ2_bzCompressEnd(&stream);
}
return compressed;
}
+ (NSData *)bunzip2:(NSData*)data
{
int bzret;
bz_stream stream = { 0 };
stream.next_in = (char*)[data bytes];
stream.avail_in = [data length];
const int buffer_size = 10000;
NSMutableData * buffer = [NSMutableData dataWithLength:buffer_size];
stream.next_out = [buffer mutableBytes];
stream.avail_out = buffer_size;
NSMutableData * decompressed = [NSMutableData data];
BZ2_bzDecompressInit(&stream, 0, NO);
@try {
do {
bzret = BZ2_bzDecompress(&stream);
if (bzret != BZ_OK && bzret != BZ_STREAM_END)
@throw [NSException exceptionWithName:@"bzip2" reason:@"BZ2_bzDecompress failed" userInfo:nil];
[decompressed appendBytes:[buffer bytes] length:(buffer_size - stream.avail_out)];
stream.next_out = [buffer mutableBytes];
stream.avail_out = buffer_size;
} while(bzret != BZ_STREAM_END);
}
@finally {
BZ2_bzDecompressEnd(&stream);
}
return decompressed;
}
好了,写完了,希望对大家有所帮助,有用的话,别忘了给点个赞,嘿嘿