这世上最强大的,不是绝世武功,而是在经历人生沧桑之后,仍能保住一颗一往无悔绝不退缩的心。
————剑之初
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 = ""
网友评论