码迷,mamicode.com
首页 > 其他好文 > 详细

如何增大二维码种的数据存储

时间:2014-05-18 05:43:30      阅读:521      评论:0      收藏:0      [点我收藏+]

标签:二维码   加密   压缩   

最近在做项目,需求就是要传尽量多的数据,属于一个调研,估计后期会加入到项目里面,二维码其实不推荐放入大量数据,但是需求嘛,拿钱干活,可能后期还会优化,因为目前的画扫描的效率不高,主要直接用的原生的开源库zxing感觉效率不高。

一开始,从数据源下手,进行数据源压缩,首先尝试了hufman编码,huffman主要是一些开源的算法,但是实现从建树到压缩,其实有很大区别,文件我直接上传了,有兴趣的可以看一下:

http://download.csdn.net/detail/shidongdong2012/7354863

我发现这种压缩效率并不高,接着我采用了gzip+base64的组合方式,发现效果比较号:

首先在因为gzip压缩要用到zlib,所以我们要在工程里面加libz.dylib,

然后附上实现gzip的压缩实现:

h文件

#import <Foundation/Foundation.h>


@interface NSData (GZIP)

- (NSData *)gzippedDataWithCompressionLevel:(float)level;
- (NSData *)gzippedData;
- (NSData *)gunzippedData;

@end

- (NSData *)gzippedDataWithCompressionLevel:(float)level
{
    if ([self length])
    {
        z_stream stream;
        stream.zalloc = Z_NULL;
        stream.zfree = Z_NULL;
        stream.opaque = Z_NULL;
        stream.avail_in = (uint)[self length];
        stream.next_in = (Bytef *)[self bytes];
        stream.total_out = 0;
        stream.avail_out = 0;
        
        int compression = (level < 0.0f)? Z_DEFAULT_COMPRESSION: (int)(roundf(level * 9));
        if (deflateInit2(&stream, compression, Z_DEFLATED, 31, 8, Z_DEFAULT_STRATEGY) == Z_OK)
        {
            NSMutableData *data = [NSMutableData dataWithLength:ChunkSize];
            while (stream.avail_out == 0)
            {
                if (stream.total_out >= [data length])
                {
                    data.length += ChunkSize;
                }
                stream.next_out = (uint8_t *)[data mutableBytes] + stream.total_out;
                stream.avail_out = (uInt)([data length] - stream.total_out);
                deflate(&stream, Z_FINISH);
            }
            deflateEnd(&stream);
            data.length = stream.total_out;
            return data;
        }
    }
    return nil;
}

- (NSData *)gzippedData
{
    return [self gzippedDataWithCompressionLevel:-1.0f];
}

- (NSData *)gunzippedData
{
    if ([self length])
    {
        z_stream stream;
        stream.zalloc = Z_NULL;
        stream.zfree = Z_NULL;
        stream.avail_in = (uint)[self length];
        stream.next_in = (Bytef *)[self bytes];
        stream.total_out = 0;
        stream.avail_out = 0;
        
        NSMutableData *data = [NSMutableData dataWithLength:(NSUInteger)([self length] * 1.5)];
        if (inflateInit2(&stream, 47) == Z_OK)
        {
            int status = Z_OK;
            while (status == Z_OK)
            {
                if (stream.total_out >= [data length])
                {
                    data.length += [self length] * 0.5;
                }
                stream.next_out = (uint8_t *)[data mutableBytes] + stream.total_out;
                stream.avail_out = (uInt)([data length] - stream.total_out);
                status = inflate (&stream, Z_SYNC_FLUSH);
            }
            if (inflateEnd(&stream) == Z_OK)
            {
                if (status == Z_STREAM_END)
                {
                    data.length = stream.total_out;
                    return data;
                }
            }
        }
    }
    return nil;
}

注意在m文件种引入#import<zlib.h>

让我们看一下压缩实现:

 NSData * data = [resultStr dataUsingEncoding:NSUTF8StringEncoding];
    
    NSData * compressData = [data gzippedData];
    
    NSString *  rstring = [compressData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

resultstr是传入的string,由于gzip只能进行数据压缩,所以要向转成data数据,然后进行压缩,压缩后不能直接转成string,任何编码都不行,由于压缩后的data数据可能出现大量的0,所以在转string的是否会出现字段截断,所以base64的加密处理,能很好的处理这个问题,又保证了数据的安全。

看看如果扫描到结果怎么处理吧:

NSData * data = [[NSData alloc] initWithBase64EncodedString:[result text] options:NSDataBase64Encoding64CharacterLineLength];
        
        NSString * str = [[NSString alloc] initWithData:[data gunzippedData] encoding:NSUTF8StringEncoding];

逆向处理一下,由于base64的方法在ios7才存在,所以如果要兼容,还是要朝霞base64的加密算法源码哦,网上的例子也很多,可以看下哦

如何增大二维码种的数据存储,布布扣,bubuko.com

如何增大二维码种的数据存储

标签:二维码   加密   压缩   

原文地址:http://blog.csdn.net/shidongdong2012/article/details/25955689

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!