美文网首页iOS 好东西
iOS官方文档 Foundation篇---Binary Dat

iOS官方文档 Foundation篇---Binary Dat

作者: qianfei | 来源:发表于2019-01-26 17:29 被阅读11次

    这世上最强大的,不是绝世武功,而是在经历人生沧桑之后,仍能保住一颗一往无悔绝不退缩的心。

    ————剑之初

    NSData

    NSData是用来包装数据的,NSData存储的是二进制数据,屏蔽了数据之间的差异,文本、音频、图像等数据都可用NSData来存储;

    创建NSData数据
    //创建一个空数据对象
    + (instancetype)data;
    //创建包含另一个数据对象内容的数据对象
    + (instancetype)dataWithData:(NSData *)data;
    //创建一个给定字节数的数据对象
    + (instancetype)dataWithBytes:(nullable const void *)bytes length:(NSUInteger)length;
    //该方法还不懂,请大神指教
    + (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length;
    //该方法还不懂,请大神指教
    + (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;
    
    - (instancetype)initWithData:(NSData *)data;
    - (instancetype)initWithBytes:(nullable const void *)bytes length:(NSUInteger)length;
    - (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length;
    - (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;
    - (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length deallocator:(nullable void (^)(void *bytes, NSUInteger length))deallocator API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0));
    
    NSData *data = [NSData data];
    NSData *data1 = [NSData dataWithData:data];
    char *str = "123456789";
    NSData *data2 = [NSData dataWithBytes:str length:strlen(str)];
    
    从文件中读取数据
    + (nullable instancetype)dataWithContentsOfFile:(NSString *)path;
    + (nullable instancetype)dataWithContentsOfURL:(NSURL *)url;
    
    /** NSDataReadingOptions:读取数据选项
    
     *  NSDataReadingMappedIfSafe: 不会占用实际内存
     *  NSDataReadingUncached: 数据将不会存入内存中
     *  NSDataReadingMappedAlways: 数据会被存储在内存中
     */
    /**
     读取路径文件的数据
     
     @param path:数据文件的绝对路径
     @param readOptionsMask :读取数据的选项
     @param errorPtr:表示错误的对象
    
     @return instancetype 数据
     */
    + (nullable instancetype)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;
    
    /**
     读取URL指定位置的数据
     
     @param url:读取数据的URL
     @param readOptionsMask :读取数据的选项
     @param errorPtr:表示错误的对象
    
     @return instancetype 数据
     */
    + (nullable instancetype)dataWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;
    
    
    - (nullable instancetype)initWithContentsOfFile:(NSString *)path;
    - (nullable instancetype)initWithContentsOfURL:(NSURL *)url;
    - (nullable instancetype)initWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;
    - (nullable instancetype)initWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;
    
    
    NSData *data = [NSData dataWithContentsOfFile: filePath];
    NSData *data = [NSData dataWithContentsOfURL: urlPath];
    NSData *data = [NSData dataWithContentsOfFile: filePath options:NSDataReadingMappedAlways error:nil];
    NSData *rdata = [NSData dataWithContentsOfURL: urlPath options:NSDataReadingMappedAlways error:nil];
    
    将数据写入文件
    /**
     数据写入给定路径指定的文件
     
     @param path:数据写入路径
     @param useAuxiliaryFile :如果YES,数据被写入备份文件,然后 - 假设没有发生错误 - 备份文件被重命名为指定的名称path; 为NO,则数据直接写入path
    
     @return BOOL 写入结果
     */
    - (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
    - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically; 
    
    /** NSDataWritingOptions:写入数据选项
     *
     *  NSDataWritingAtomic: 首先将数据写入辅助文件然后交换文件
     *  NSDataWritingWithoutOverwriting: 防止覆盖现有文件
     *  NSDataWritingFileProtectionNone: 文件不以加密格式存储,并且在任何时候都可以访问
     *  NSDataWritingFileProtectionComplete: 文件以加密格式存储,并且在设备锁定时访问文件会失败。
     *  NSDataWritingFileProtectionCompleteUnlessOpen: 设备锁定时无法打开文件进行读取或写入,如果在设备锁定时打开其中一个文件,则仍允许读写
     *  NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication:可以在设备锁定时读取或写入文件,但在启动时不可以
     */
    /**
     数据写入给定路径指定的文件
     
     @param path:数据写入路径
     @param writeOptionsMask :写入数据的选项
     @param errorPtr errorPtr:表示错误的对象
    
     @return instancetype 数据
     */
    - (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;
    - (BOOL)writeToURL:(NSURL *)url options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;
    
    [data writeToFile:filePath atomically:YES];
    [data writeToFile: filePath  options:NSDataWritingAtomic error:nil];
    
    Base64编码与解码
    
    /** NSDataBase64EncodingOptions:编码选项
     *
     *  NSDataBase64Encoding64CharacterLineLength: 将最大行长度设置为64个字符,然后插入行结尾
     *  NSDataBase64Encoding76CharacterLineLength: 将最大行长度设置为76个字符,然后插入行结尾
     *  NSDataBase64EncodingEndLineWithCarriageReturn: 设置最大行长度时,请指定要插入的行应包含回车符
     *  NSDataBase64EncodingEndLineWithLineFeed: 设置最大行长度时,请指定要插入的行应包含换行符
     */
    /**
     Base64解码,base64编码后的字符串转化为NSData数据
     
     @param base64String:Base64编码的字符串
     @param options :解码选项
    
     @return instancetype:解码后的NSData数据
     */
    - (nullable instancetype)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)options API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0));
    
    /**
     Base64 编码,将data数据转化成base64之后的NSString字符串
     
     @param options :解码选项
    
     @return instancetype:编码后的NSString字符串
     */
    - (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0));
    
    /**
     Base64解码,将base64编码之后的data数据再转化为NSData数据
     
     @param base64Data:数据写入路径
     @param options :解码选项
    
     @return instancetype:解码后的NSData数据
     */
    - (nullable instancetype)initWithBase64EncodedData:(NSData *)base64Data options:(NSDataBase64DecodingOptions)options API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0));
    
    /**
     Base64编码,将data数据转化成base64之后的NSData数据
    
     @param options :编码选项
    
     @return instancetype:编码后的NSData数据
     */
    - (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0));
    
    编码和解码
    //编码
    //字符串base64编码
    NSString *str = @"qwerty";
    NSData *strData = [str dataUsingEncoding:NSUTF8StringEncoding];
    //将data数据转化成base64之后的NSString字符串
    NSString *encodeStr = [strData
    base64EncodedStringWithOptions:0];//cXdlcnR5
    //将data数据转化成base64之后的NSData数据
    NSData *endcodeData = [strData base64EncodedDataWithOptions:0];
    
    //解码
    //base64编码后的字符串转化为NSData数据
    NSData *dcodeData = [[NSData alloc]initWithBase64EncodedString:encodeStr options 0];
    NSString *decodeStr = [[NSString alloc]initWithData:dcodeData encoding:NSUTF8StringEncoding];//qwerty
    //将base64编码之后的data数据再转化为NSData数据
    NSData *dcodeData = [[NSData alloc]initWithBase64EncodedData:endcodeData options 0];
    NSString *decodeStr = [[NSString alloc]initWithData:dcodeData encoding:NSUTF8StringEncoding];//qwerty
    
    访问字节
    // 遍历数据对象每个字节的范围
    - (void) enumerateByteRangesUsingBlock:(void (NS_NOESCAPE ^)(const void *bytes, NSRange byteRange, BOOL *stop))block API_AVAILABLE(macos(10.9), ios(7.0), watchos(2.0), tvos(9.0));
    
    // 取出data中指定长度的字节存入buffer
    - (void)getBytes:(void *)buffer length:(NSUInteger)length;
    
    //取出data中指定位置长度的字节存入buffer
    - (void)getBytes:(void *)buffer range:(NSRange)range;
    
    访问数据
    //返回指定范围长度的data
    - (NSData *)subdataWithRange:(NSRange)range;
    
    /** NSDataSearchOptions:编码选项
     *
     *  NSDataSearchBackwards: 从数据对象的末尾搜索
     *  NSDataSearchAnchored: 从数据对象的起始搜索
     */
    /**
     根据给定选项,查找并返回指定范围内指定数据第一次出现的位置
    
     @param dataToFind :搜索的Data
     @param mask :搜索选项
     @param searchRange :搜索范围
    
     @return instancetype:编码后的NSData数据
     */
    - (NSRange)rangeOfData:(NSData *)dataToFind options:(NSDataSearchOptions)mask range:(NSRange)searchRange API_AVAILABLE(macos(10.6), ios(4.0), watchos(2.0), tvos(9.0));
    
    //返回一个布尔值,判断数据对象是否与另一个数据对象相同
    - (BOOL)isEqualToData:(NSData *)other;
    
    //数据对象包含的字节数
    @property (readonly) NSUInteger length;
    
    NSString *str = @"qwerty";
    NSData *strData = [str dataUsingEncoding:NSUTF8StringEncoding];
    NSUInteger len = strData.length;//6
    NSData *subData = [strData subdataWithRange:NSMakeRange(0, 3)];
    NSString *st = [[NSString alloc]initWithData:subData
    encoding:NSUTF8StringEncoding];//qwe
    NSRange range = [strData rangeOfData:subData
    options:NSDataSearchBackwards range:NSMakeRange(0, len)];//range = location=0, length=3
    

    NSMutableData

    NSMutableData继承自NSData;可对NSMutableData数据对象进行增加和修改等操作;

    创建NSMutableData数据
    //创建并返回一个能够保存指定字节数的可变数据对象
    + (nullable instancetype)dataWithCapacity:(NSUInteger)aNumItems;
    //创建并返回包含指定长度的可变数据对象
    + (nullable instancetype)dataWithLength:(NSUInteger)length;
    - (nullable instancetype)initWithCapacity:(NSUInteger)capacity;
    - (nullable instancetype)initWithLength:(NSUInteger)length;
    
    NSMutableData *mulData = [NSMutableData dataWithCapacity:10];//mulData.length = 0
    NSMutableData *mulData1 = [NSMutableData dataWithLength:10];//mulData1.length = 10
    char *stri = "qwerty";
    NSData *data2 = [NSData dataWithBytes:stri length:strlen(stri)];
    [mulData setData: data2];//mulData.length = 6
    
    操作NSMutableData数据
    #添加数据
    //添加给定数量的字节
    - (void)appendBytes:(const void *)bytes length:(NSUInteger)length;
    //将另一个数据对象的内容附加到接收方
    - (void)appendData:(NSData *)other;
    //将接收器的长度增加给定的字节数
    - (void)increaseLengthBy:(NSUInteger)extraLength;
    
    #修改数据
    //用接收器内容中给定范围的给定字节集替换
    - (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)bytes;
    //用接收器内容中给定范围的给定字节集替换
    - (void)replaceBytesInRange:(NSRange)range withBytes:(nullable const void *)replacementBytes length:(NSUInteger)replacementLength;
    //在给定范围内将接收器的内容替换为零
    - (void)resetBytesInRange:(NSRange)range;
    //用另一个数据对象的内容替换接收器的全部内容。
    - (void)setData:(NSData *)data;
    
    
    NSMutableData *mulData = [NSMutableData dataWithCapacity:10];//mulData = 0
    char *stri = "qwerty";
    NSData *data = [NSData dataWithBytes:stri length:strlen(stri)];
    //添加数据
    [mulData appendBytes:stri length:strlen(stri)];//mulData.length = 6
    [mulData appendData:data];//mulData.length = 12
    [mulData increaseLengthBy:20];//mulData.length = 32
    
    // 修改数据
    char *str = "123";
    [mulData replaceBytesInRange:NSMakeRange(0, strlen(str)) withBytes:str];//mulData.length = 32  mulDataStr  = 123rtyqwerty
    [mulData replaceBytesInRange:NSMakeRange(3,strlen(str)) withBytes:str length:strlen(str)];//mulData.length = 32  mulDataStr = qwe123qwerty
    [mulData setData:data];//mulData.length = 6  mulDataStr = qwerty
    [mulData resetBytesInRange:NSMakeRange(0,3)];//mulData.length = 6 mulDataStr = ""
    
    

    欢迎留言指正,会持续更新!!!

    相关文章

      网友评论

        本文标题:iOS官方文档 Foundation篇---Binary Dat

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