bzip2压缩和解压缩

最近做项目遇到了个难题,项目中要用到数据压缩,和普通的文件的压缩和解压缩不同,这里直接对数据比如NSData ,NSString 等类型的数据进行压缩,遇到这个问题首先在网上找了好多文章,比如gitHub上,一开始我很快就找到了一片关于解压缩的代码,代码链接分享给大家 https://github.com/dingtianran/LibBzip2

可是,这个例子支持解压缩,不支持数据压缩,那怎么办呢,又纠结了好长时间,后来终于找到了一篇文章就是针对解决这个问题的,把链接分享给大家:

http://stackoverflow.com/questions/9577735/how-compress-data-in-memory-buffer-by-using-libbz2-library-in-c-program

我还是把代码粘贴一下吧,防止大家找不到位置:(注意在使用时,需要导入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;
}

好了,写完了,希望对大家有所帮助,有用的话,别忘了给点个赞,嘿嘿

posted @ 2014-04-09 10:11  zcb1989  阅读(1747)  评论(0编辑  收藏  举报