objective-C之NSData

来源:互联网 发布:哪个软件有汉仪丫丫体 编辑:程序博客网 时间:2024/04/30 21:50

学习NSData,在网上找资料竟然都是拷贝的纯代码,没人去解释。在这种网上没资料的情况下,整理这个API文件好难,好艰辛。在这贡献给大家了,么么哒~示例程序用红色标注。

一,NSData的API学习

1.data读取过程的可选配置条件

typedef NS_OPTIONS(NSUInteger, NSDataReadingOptions) {    NSDataReadingMappedIfSafe =   1UL << 0,    NSDataReadingUncached = 1UL << 1,     NSDataReadingMappedAlways NS_ENUM_AVAILABLE(10_7, 5_0) = 1UL << 3,     NSDataReadingMapped = NSDataReadingMappedIfSafe,// Deprecated name for NSDataReadingMappedIfSafe    NSMappedRead = NSDataReadingMapped,// Deprecated name for NSDataReadingMapped    NSUncachedRead = NSDataReadingUncached// Deprecated name for NSDataReadingUncached};
2.data写入过程的可选配置条件
typedef NS_OPTIONS(NSUInteger, NSDataWritingOptions) {    NSDataWritingAtomic = 1UL << 0,    NSDataWritingWithoutOverwriting NS_ENUM_AVAILABLE(10_8, 6_0) = 1UL << 1,     NSDataWritingFileProtectionNone NS_ENUM_AVAILABLE_IOS(4_0)                                  = 0x10000000,    NSDataWritingFileProtectionComplete NS_ENUM_AVAILABLE_IOS(4_0)                              = 0x20000000,    NSDataWritingFileProtectionCompleteUnlessOpen NS_ENUM_AVAILABLE_IOS(5_0)                    = 0x30000000,    NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication NS_ENUM_AVAILABLE_IOS(5_0)  = 0x40000000,    NSDataWritingFileProtectionMask NS_ENUM_AVAILABLE_IOS(4_0)                                  = 0xf0000000,    NSAtomicWrite = NSDataWritingAtomic };
/**************** Data Search Options ****************/
3.data在搜索过程中的可选配置条件
typedef NS_OPTIONS(NSUInteger, NSDataSearchOptions) {    NSDataSearchBackwards = 1UL << 0,    NSDataSearchAnchored = 1UL << 1} NS_ENUM_AVAILABLE(10_6, 4_0);
/*** 下方为已废弃代码,不多做解释 ***/
@interface NSData (NSDeprecated)- (void)getBytes:(void *)buffer NS_DEPRECATED(10_0, 10_10, 2_0, 8_0, "This method is unsafe because it could potentially cause buffer overruns. Use -getBytes:length: instead.");+ (id)dataWithContentsOfMappedFile:(NSString *)path NS_DEPRECATED(10_0, 10_10, 2_0, 8_0, "Use +dataWithContentsOfURL:options:error: and NSDataReadingMappedIfSafe or NSDataReadingMappedAlways instead.");- (id)initWithContentsOfMappedFile:(NSString *)path  NS_DEPRECATED(10_0, 10_10, 2_0, 8_0, "Use -initWithContentsOfURL:options:error: and NSDataReadingMappedIfSafe or NSDataReadingMappedAlways instead.");- (id)initWithBase64Encoding:(NSString *)base64String NS_DEPRECATED(10_6, 10_9, 4_0, 7_0);- (NSString *)base64Encoding NS_DEPRECATED(10_6, 10_9, 4_0, 7_0);@end

/**************** Base 64 Options ****************/

/*** Base64是一组二进制到文本转化的方案,以ASSCII格式表示二进制数据,这些方案用来编码二进制数据以存储或者通过把多媒体文件转换成文本数据进行传输,这个能保证数据在传输的过程中的完整性。Base64醉常见的用于是处理电子邮件附件,或者解码小图片。在iOS7之前,Base64的编码和解码是需要自己实现的或者是使用第三方库,但是现在苹果提供一些API来实现Base64功能 ***/
4.base64编码中的一些设置选择

typedef NS_OPTIONS(NSUInteger, NSDataBase64EncodingOptions) {    NSDataBase64Encoding64CharacterLineLength = 1UL << 0,    NSDataBase64Encoding76CharacterLineLength = 1UL << 1,    NSDataBase64EncodingEndLineWithCarriageReturn = 1UL << 4,    NSDataBase64EncodingEndLineWithLineFeed = 1UL << 5,} NS_ENUM_AVAILABLE(10_9, 7_0);
5.base64在解码过程中的option可选条件,下面选项表示在将解码过程中忽略不能识别的字节
typedef NS_OPTIONS(NSUInteger, NSDataBase64DecodingOptions) {    NSDataBase64DecodingIgnoreUnknownCharacters = 1UL << 0 } NS_ENUM_AVAILABLE(10_9, 7_0);
/**************** Immutable Data 不可变的Data ****************/
@interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>//6.获取data长度的属性@property (readonly) NSUInteger length;//7.返回data对象的首指针@property (readonly) const void *bytes NS_RETURNS_INNER_POINTER;@end

/*** 创建data的所有相关方法作为一个类别几种到一块 ***/

@interface NSData (NSExtendedData)//8.返回一个ASCII编码格式的字符串,采用的格式是data属性列表的格式。@property (readonly, copy) NSString *description;//9.取出data中指定长度的字节存入buffer这个提前声明的数组中- (void)getBytes:(void *)buffer length:(NSUInteger)length;//9.取出data中指定位置range的字节存入buffer这个提前声明的数组中- (void)getBytes:(void *)buffer range:(NSRange)range;//10.判断两个data是否相等- (BOOL)isEqualToData:(NSData *)other;//11.截图data指定位置的子data- (NSData *)subdataWithRange:(NSRange)range;//12.将data写入指定的文件- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;//13.将data写入指定的url- (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically; //14.将data写入指定文件,并且有写入过程的设置条件,带错误信息- (BOOL)writeToFile:(NSString *)path options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;//15.将data写入指定的url,并且有写入过程的设置条件,带错误信息- (BOOL)writeToURL:(NSURL *)url options:(NSDataWritingOptions)writeOptionsMask error:(NSError **)errorPtr;//16.搜索在data1内部存在data2的位置,并且有搜索配置条件,并且可加入搜索的范围- (NSRange)rangeOfData:(NSData *)dataToFind options:(NSDataSearchOptions)mask range:(NSRange)searchRange NS_AVAILABLE(10_6, 4_0);//17.列举遍历字典的方法- (void) enumerateByteRangesUsingBlock:(void (^)(const void *bytes, NSRange byteRange, BOOL *stop))block NS_AVAILABLE(10_9, 7_0);@end

@interface NSData (NSDataCreation)//18.data的快速创建办法+ (instancetype)data;//19.赋值以bytes开头,长度为length的数据,进行初始化使其成为数据对象的内容+ (instancetype)dataWithBytes:(const void *)bytes length:(NSUInteger)length;//20.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。+ (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length;//21.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。当flag为yes的时候,生成的data对象是bytes的所有者,当data对象被释放的时候也会同时释放bytes,所以bytes必须是通过malloc在堆上分配的内存。当flag为no的时候,bytes不会被自动释放,释放bytes时要注意时机,不要再data对象还被使用的时候释放bytes。+ (instancetype)dataWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;//22.加载file文件,并且有可选择读取文件的选项配置条件,带有错误信息+ (instancetype)dataWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;//23.加载url,并且有可选择读取文件的选项配置条件,带有错误信息+ (instancetype)dataWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;//24.从参数path指定的文件读入二进制数据,用该数据初始化NSData对象。+ (instancetype)dataWithContentsOfFile:(NSString *)path;//25.从参数path指定的url读入,用该数据初始化NSData对象。+ (instancetype)dataWithContentsOfURL:(NSURL *)url;//26.赋值以bytes开头,长度为length的数据,进行初始化使其成为数据对象的内容- (instancetype)initWithBytes:(const void *)bytes length:(NSUInteger)length;//27.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。- (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length;//28.这个方法生成的data中保存的是指向数据的指针,并没有对数据进行复制操作。当flag为yes的时候,生成的data对象是bytes的所有者,当data对象被释放的时候也会同时释放bytes,所以bytes必须是通过malloc在堆上分配的内存。当flag为no的时候,bytes不会被自动释放,释放bytes时要注意时机,不要再data对象还被使用的时候释放bytes。- (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;//29.- (instancetype)initWithBytesNoCopy:(void *)bytes length:(NSUInteger)length deallocator:(void (^)(void *bytes, NSUInteger length))deallocator NS_AVAILABLE(10_9, 7_0);//30.从参数path指定的文件读入二进制数据,用该数据初始化NSData对象。如果读取文件失败,则释放调用者并返回nil,同时把错误信息写入指针errorPtr。mask是一个选项信息,用于指定是否使用虚拟内存等。- (instancetype)initWithContentsOfFile:(NSString *)path options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;//31.从参数url指定的路径中读入,用该数据初始化NSData对象。如果读取文件失败,则释放调用者并返回nil,同时把错误信息写入指针errorPtr。mask是一个选项信息,用于指定是否使用虚拟内存等。- (instancetype)initWithContentsOfURL:(NSURL *)url options:(NSDataReadingOptions)readOptionsMask error:(NSError **)errorPtr;//32.加载flie文件路径- (instancetype)initWithContentsOfFile:(NSString *)path;//33.加载url- (instancetype)initWithContentsOfURL:(NSURL *)url;//34.用指定的NSData对象aData来创建一个新的NSData对象,参数可以是NSMutableData对象。- (instancetype)initWithData:(NSData *)data;//35.用指定的NSData对象aData来创建一个新的NSData对象,参数可以是NSMutableData对象。+ (instancetype)dataWithData:(NSData *)data;@end
/*** base64方案编码分类  iOS7之后苹果给出以下四个API供实现base64方案 头两个是处理字符串的,后两个是处理UTF-8编码数据的,这两个承兑的方法功能是一样的,但是有时候用其中一个比另一个效率要高。如果你像要bae64编码字符串然后写进文件,你应该使用UTF-8编码数据的这对方法。如果你打算base64编码字符串之后用作json,你应该使用另外一对方法 编码解码一一对应***/
@interface NSData (NSDataBase64Encoding)//36.解码。将已经base64编码之后的字符串数据再转化为NSData数据,- (instancetype)initWithBase64EncodedString:(NSString *)base64String options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0);//37.编码。将一个data数据利用base64方案转化成base64之后的NSString字符串- (NSString *)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);//38.解码。将已经base64编码之后的NSData数据再转化为NSData数据- (instancetype)initWithBase64EncodedData:(NSData *)base64Data options:(NSDataBase64DecodingOptions)options NS_AVAILABLE(10_9, 7_0);//39.编码.将一个data数据利用base64方案转化成base64之后的NSData数据- (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);@end

示例程序:使用第一对编码解码API。

NSString * stringExample = [NSString stringWithFormat:@"I Love You"];NSData * data1 = [stringExample dataUsingEncoding:NSUTF8StringEncoding];
NSString * base64String   = [data1 base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];NSLog(@"Base64-encoded string is %@",base64String);//log(Base64-encoded string is SSBMb3ZlIFlvdQ==);
NSData * dataFromString = [[NSData alloc] initWithBase64EncodedString:base64String options:NSDataBase64DecodingIgnoreUnknownCharacters];NSLog(@"string is %@",[NSString stringWithUTF8String:[dataFromString bytes]]); //log(string is I Love You);
/**************** Mutable Data可变data****************/
@interface NSMutableData : NSData//40.可变data的可变字节@property (readonly) void *mutableBytes NS_RETURNS_INNER_POINTER;//41.可变data的长度@property NSUInteger length;@end

/*** 创建NSMutableData的所有相关方法作为一个类别几种到一块 ***/

@interface NSMutableData (NSExtendedMutableData)//42.给可变data追加字节- (void)appendBytes:(const void *)bytes length:(NSUInteger)length;//43.给data追加其他的data- (void)appendData:(NSData *)other;//44.为已经存在的data追加新的长度- (void)increaseLengthBy:(NSUInteger)extraLength;       示例程序:      NSMutableData * data = [NSMutableData data];      [data increaseLengthBy:5];      NSLog(@"dataLength———%lu",(unsigned long)data.length);//45.给data替换对应位置的字节- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)bytes;//46.重置可变data对应位置的字节- (void)resetBytesInRange:(NSRange)range;//47.为可变data设置data数据- (void)setData:(NSData *)data;//48.给data替换对应位置的字节, 并且存在替换长度- (void)replaceBytesInRange:(NSRange)range withBytes:(const void *)replacementBytes length:(NSUInteger)replacementLength;@end0
@interface NSMutableData (NSMutableDataCreation)//49.动态创建可变data 并且初始化指定大小+ (instancetype)dataWithCapacity:(NSUInteger)aNumItems;//50.动态创建可变data 并且初始化指定长度+ (instancetype)dataWithLength:(NSUInteger)length;//51.静态创建可变data 并且初始化指定大小- (instancetype)initWithCapacity:(NSUInteger)capacity;//52.静态创建可变data 并且初始化指定长度 - (instancetype)initWithLength:(NSUInteger)length;@end
/****************     Purgeable Data ****************/
NS_CLASS_AVAILABLE(10_6, 4_0)@interface NSPurgeableData : NSMutableData <NSDiscardableContent> {@private    NSUInteger _length;    int32_t _accessCount;    uint8_t _private[32];    void *_reserved;}@end

参考:http://www.myexception.cn/mobile/1897470.html

二,Object-C 中各数据类型转换 NSData转NSString,Byte,UIImage

/*** NSData和NSMutableData存储的是二进制数据,在文件操作,网络,以及核心图形图像中使用较广泛。NSData创建后不可以再修改,NSMutableData可以再次修改。ByteBuffer其实就是一个字节缓冲区, 在这里你可以对缓冲区的数据进行 字节级的操作. 这样的好处在于你可以比较方便的获取到底层的字节操作和字节数据 ***/

1,NSData 与 NSString

  NSData --> NSString  NSString *aString = [[NSString alloc] initWithData:adata encoding:NSUTF8StringEncoding];  NSString --> NSData  NSString *aString = @"1234";  NSData *aData = [aString dataUsingEncoding: NSUTF8StringEncoding];
2,NSData 与 Byte
  NSData --> Byte 
   NSString *testString = @"1234567890";  NSData *testData = [testString dataUsingEncoding: NSUTF8StringEncoding];  Byte *testByte = (Byte *)[testData bytes];
  Byte --> NSData 
   Byte byte[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};   NSData *adata = [[NSData alloc] initWithBytes:byte length:24];
3,NSData 与 UIImage
  NSData --> UIImage 
   UIImage *aimage = [UIImage imageWithData: imageData];  //例:从本地文件沙盒中取图片并转换为NSData  NSString *path = [[NSBundle mainBundle] bundlePath];  NSString *name = [NSString stringWithFormat:@"ceshi.png"];  NSString *finalPath = [path stringByAppendingPathComponent:name];  NSData *imageData = [NSData dataWithContentsOfFile: finalPath];  UIImage *aimage = [UIImage imageWithData: imageData];
  UIImage-> NSData

  NSData *imageData = UIImagePNGRepresentation(aimae);//png   NSData * imageData =UIImageJPEGRepresentation(aimae, 0)//jpeg
4,NSData 与 NSMutableData
  NSData --> MSMutableData
  NSData *data=[[NSData alloc]init];  NSMutableData *mdata=[[NSMutableData alloc]init];     mdata=[NSData dataWithData:data];

5.NSData 读取其中一部分数据 

NSData *data1 = [data0 subdataWithRange:NSMakeRange(200, 500)];

6.NSData与文件读取,写入

     //将文件的内容读入内存缓冲区

   NSData *fileData;  NSFileManager *fileManager = [[NSFileManager alloc]init];  fileData = [fileManager contentsAtPath:path];
     //将缓冲区的内容写入到一个文件中
  NSFileManager *fileManager = [[NSFileManager alloc]init];  [fileManager createFileAtPath:path contents:fileData attributes:nil];





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孕中期羊水过少怎么办 心脏办膜关闭不全怎么办 9个月胎儿脑积水怎么办 怀孕三个月胎盘低置怎么办 怀孕第一个月打针了怎么办 唐氏筛查神经管缺陷高风险怎么办 门诊处方笺丢了怎么办 孕中期睡觉手麻怎么办 怀孕2个月了没胎心胎芽怎么办 怀孕腿疼的厉害怎么办 孕妇老是失眠多梦怎么办 孕妇会失眠多梦怎么办 怀孕5个月睡不着怎么办 6个月孕妇失眠怎么办 彩超脉络丛囊肿怎么办 双侧脉络丛囊肿怎么办 唐筛神经管缺陷高风险怎么办 雌激素低怎么办吃什么东西补 我怀了狗的孩子怎么办 结婚2年不要孩子怎么办 备孕一直没怀孕怎么办 刚生的婴儿打嗝怎么办 小孩40天黄疸高怎么办 婴儿身高长得慢怎么办 四个月的宝宝哭怎么办 孕39周羊水偏多怎么办 孕39周羊水浑浊怎么办 孕晚期羊水过少怎么办 怀孕脐带绕颈一周怎么办 nt检查宝宝趴着怎么办 四维胎儿有问题怎么办 怀孕70天没有胎心怎么办 怀孕20天不想要怎么办 换轮胎胎压监测怎么办 怀孕了吐的厉害该怎么办 怀孕吐完嗓子疼怎么办 怀孕16周不想要怎么办 怀孕四个月胎盘低置怎么办 孕37周胎盘三级怎么办 孕37周胎盘老化怎么办 怀孕22周胎盘1级怎么办