美文网首页
iOS数据储存之文件储存

iOS数据储存之文件储存

作者: 季末微夏 | 来源:发表于2018-07-22 21:52 被阅读39次

前言

开发APP,很多时候都会遇到数据储存,本文通过文件储存的方式实现了数据储存。

思路

为了方便使用,简单封装了一下,可以储存字典和数组,如果字典或者数组中需要装自定义模型,需要模型实现归档解档。

1.基本方法

/**
 储存数组
 
 @param array 数组
 @param key 关键词
 */
+ (void)setArray:(NSArray *)array forKey:(NSString *)key;

/**
 读取数组
 
 @param key 关键词
 @return 数组
 */
+ (NSArray *)arrayForKey:(NSString *)key;

/**
 储存字典
 
 @param dic 字典
 @param key 关键词
 */
+ (void)setDic:(NSDictionary *)dic forKey:(NSString *)key;

/**
 读取字典
 
 @param key 关键词
 @return 字典
 */
+ (NSDictionary *)objectForkey:(NSString *)key;


/**
 根据关键词删除

 @param key 关键词
 @return 是否删除成功
 */
+ (BOOL)removeForKey:(NSString *)key;

/**
 删除所有
 
 @return 删除是否成功
 */
+ (BOOL)removeAll;

2.数据加密解密

数据加密是自定义的,可以自己按照自己的规则修改。

/**
 加密
 
 @param data 数据
 @param key 关键词
 @return 加密后数据
 */
+ (NSData *)encryptionWithData:(NSData *)data key:(NSString *)key{
    //压缩数据
    NSData *baseData = [[self gzippedDataWithCompressionLevel:0.1f data:data] base64EncodedDataWithOptions:0];
    return baseData;
}

/**
 解密
 
 @param data 数据
 @param key 关键词
 @return 解密后数据
 */
+ (NSData *)decryptWithData:(NSData *)data key:(NSString *)key{
    return [self gunzippedData:data];
}

/**
 32位 小写
 */
+(NSString *)MD5ForLower32Bate:(NSString *)str{
    
    //要进行UTF8的转码
    const char* input = [str UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input, (CC_LONG)strlen(input), result);
    
    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [digest appendFormat:@"%02x", result[i]];
    }
    
    return digest;
}

/**
 32位 大写
 */
+(NSString *)MD5ForUpper32Bate:(NSString *)str{
    
    //要进行UTF8的转码
    const char* input = [str UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(input, (CC_LONG)strlen(input), result);
    
    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
        [digest appendFormat:@"%02X", result[i]];
    }
    
    return digest;
}

/**
 16位 大写
 */
+(NSString *)MD5ForUpper16Bate:(NSString *)str{
    
    NSString *md5Str = [self MD5ForUpper32Bate:str];
    
    NSString  *string;
    for (int i=0; i<24; i++) {
        string=[md5Str substringWithRange:NSMakeRange(8, 16)];
    }
    return string;
}

/**
 16位 小写
 */
+(NSString *)MD5ForLower16Bate:(NSString *)str{
    
    NSString *md5Str = [self MD5ForLower32Bate:str];
    
    NSString  *string;
    for (int i=0; i<24; i++) {
        string=[md5Str substringWithRange:NSMakeRange(8, 16)];
    }
    return string;
}

数据压缩

采用Gzip压缩数据。

//MARK:JmoVxia---按等级压缩(0-1)
+ (nullable NSData *)gzippedDataWithCompressionLevel:(float)level data:(NSData *)data{
    if (data.length == 0 || [self isGzippedData:data])
    {
        return data;
    }
    
    z_stream stream;
    stream.zalloc = Z_NULL;
    stream.zfree = Z_NULL;
    stream.opaque = Z_NULL;
    stream.avail_in = (uint)data.length;
    stream.next_in = (Bytef *)(void *)data.bytes;
    stream.total_out = 0;
    stream.avail_out = 0;
    
    static const NSUInteger ChunkSize = 16384;
    
    NSMutableData *output = nil;
    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)
    {
        output = [NSMutableData dataWithLength:ChunkSize];
        while (stream.avail_out == 0)
        {
            if (stream.total_out >= output.length)
            {
                output.length += ChunkSize;
            }
            stream.next_out = (uint8_t *)output.mutableBytes + stream.total_out;
            stream.avail_out = (uInt)(output.length - stream.total_out);
            deflate(&stream, Z_FINISH);
        }
        deflateEnd(&stream);
        output.length = stream.total_out;
    }
    
    return output;
}

+ (nullable NSData *)gzippedData:(NSData *)data {
    return [self gzippedDataWithCompressionLevel:-1.0f data:data];
    
}
//MARK:JmoVxia---解压,默认
+ (nullable NSData *)gunzippedData:(NSData *)data {
    if (data.length == 0 || ![self isGzippedData:data])
    {
        return data;
    }
    
    z_stream stream;
    stream.zalloc = Z_NULL;
    stream.zfree = Z_NULL;
    stream.avail_in = (uint)data.length;
    stream.next_in = (Bytef *)data.bytes;
    stream.total_out = 0;
    stream.avail_out = 0;
    
    NSMutableData *output = nil;
    if (inflateInit2(&stream, 47) == Z_OK)
    {
        int status = Z_OK;
        output = [NSMutableData dataWithCapacity:data.length * 2];
        while (status == Z_OK)
        {
            if (stream.total_out >= output.length)
            {
                output.length += data.length / 2;
            }
            stream.next_out = (uint8_t *)output.mutableBytes + stream.total_out;
            stream.avail_out = (uInt)(output.length - stream.total_out);
            status = inflate (&stream, Z_SYNC_FLUSH);
        }
        if (inflateEnd(&stream) == Z_OK)
        {
            if (status == Z_STREAM_END)
            {
                output.length = stream.total_out;
            }
        }
    }
    
    return output;
}
//MARK:JmoVxia---是否是Gzip压缩数据
+ (BOOL)isGzippedData:(NSData *)data {
    const UInt8 *bytes = (const UInt8 *)data.bytes;
    return (data.length >= 2 && bytes[0] == 0x1f && bytes[1] == 0x8b);
}

其他

简单的封装了一下,仅供大家参考,代码比较简单,完整项目地址------>CLLocalization

相关文章

  • iOS数据储存之文件储存

    前言 开发APP,很多时候都会遇到数据储存,本文通过文件储存的方式实现了数据储存。 思路 为了方便使用,简单封装了...

  • iOS将文件切片储存并上传仿断点续传机制

    iOS将文件切片储存并上传仿断点续传机制 iOS将文件切片储存并上传仿断点续传机制

  • 6.1 数据储存-文件储存读写

    标注:本文为个人学习使用,仅做自己学习参考使用,请勿转载和转发2018-07-31: 初稿,啊这么多天我都干了什么...

  • IOS数据储存

    IOS编程中,有沙盒,在沙盒中有4个储存你数据的地方 1. Doucments文件夹 2.Library文件夹 3...

  • 本地存储plist 抽取方法

    储存plist数据 获取plist数据 删除plist文件

  • 文件存储

    将数据储存到文件中 将数据从文件中取出

  • 数据库笔记1

    目录介绍: bin目录,储存可执行文件 data目录,储存数据文件 docs,文档 include目录,存储包含的...

  • 第一章 绪论

    图像储存: 图像文件由文件头、调色板数据、像素数据组成。 文件头储存了特征参数,如类型、宽度高度、位数、压缩类型、...

  • 撸一个Android 数据存储

    Android里面的存储分为: 1、本地储存(也称之为数据持久化,包含文件储存,SharedPreferences...

  • python基础二

    一、文件的处理 在学习爬虫的时候对数据的储存和文件的处理有一定的了解, 这里就不多说了,链接:数据的储存一,数据的...

网友评论

      本文标题:iOS数据储存之文件储存

      本文链接:https://www.haomeiwen.com/subject/itprmftx.html