iOS NSData
学习NSData,在网上找资料竟然都是拷贝的纯代码,没人去解释。在这种网上没资料的情况下,整理这个API文件好难,好艰辛。在这贡献给大家了,么么哒~示例程序用红色标注。
/**************** 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 *bytesNS_RETURNS_INNER_POINTER;
@end
@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 (^)(constvoid *bytes, NSRange byteRange, BOOL *stop))block NS_AVAILABLE(10_9, 7_0);
@end
/*** 创建data的所有相关方法作为一个类别几种到一块 ***/
@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)optionsNS_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)optionsNS_AVAILABLE(10_9, 7_0);
//39.编码.将一个data数据利用base64方案转化成base64之后的NSData数据
- (NSData *)base64EncodedDataWithOptions:(NSDataBase64EncodingOptions)options NS_AVAILABLE(10_9, 7_0);
示例程序:使用第一对编码解码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);
@end
/****************
Mutable Data可变data****************/
@interface NSMutableData : NSData
//40.可变data的可变字节
@property (readonly) void *mutableBytes NS_RETURNS_INNER_POINTER;
//41.可变data的长度
@property NSUInteger length;
@end
@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
//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,
NSDataWritingFileProtectionNoneNS_ENUM_AVAILABLE_IOS(4_0)
= 0x10000000,
NSDataWritingFileProtectionCompleteNS_ENUM_AVAILABLE_IOS(4_0)
=0x20000000,
NSDataWritingFileProtectionCompleteUnlessOpenNS_ENUM_AVAILABLE_IOS(5_0)
= 0x30000000,
NSDataWritingFileProtectionCompleteUntilFirstUserAuthentication NS_ENUM_AVAILABLE_IOS(5_0)
= 0x40000000,
NSDataWritingFileProtectionMaskNS_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 *)pathNS_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 *)base64StringNS_DEPRECATED(10_6, 10_9, 4_0, 7_0);
- (NSString *)base64Encoding NS_DEPRECATED(10_6, 10_9, 4_0, 7_0);
@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
iOS NSData的更多相关文章
- iOS NSData简单解析
iOS 基本数据类型之NSData 1 nsdata 作用: 用于存储二进制的数据类型 nadat类提供一种简单的方式,它用来设置缓存区.将文件的内容读入到缓存区.或者将缓存区中的内容写到一个文件. ...
- ios -- NSdata 与 NSString,Byte数组,UIImage 的相互转换(转)
1. NSData 与 NSStringNSData-> NSStringNSString *aString = [[NSString alloc] initWithData:adata enc ...
- php接口 接受ios或android端图片; php接收NSData数据
备注下, [自己无意中用的方法]接收时,设置两个参数,一个是图片名称,另一个是实际文件.然后用$_FILES处理就可以了. 如: $icon = $_POST['icon'];//这个是图片的名称,用 ...
- iOS的属性声明:retain和strong的区别
声明属性时用strong或者retain效果是一样的(貌似更多开发者更倾向于用strong).不过在声明Block时,使用strong和retain会有截然不同的效果.strong会等于copy,而r ...
- iOS -OC调用js页面
我们这边和h5商量好传递一个结构体参数过去,然后由于解析的问题,导致我这里传递的参数,到h5那边不执行那边的方法 -(void)loginCallBack { NSDictionary *dic; u ...
- iOS解决NSData转NSString后字符为空
iOS中,将NSData转NSString的一般方法为[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];但是当dat ...
- iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档
1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...
- iOS NSDictionary、NSData、JSON数据类型相互转换
iOS经常需要用到数据类型的转换,下面列举一下常用类型的转换. 1.NSDictionary类型转换为NSData类型: //NSDictionary -> NSData: NSDictiona ...
- IOS的XML文件解析,利用了NSData和NSFileHandle
如果需要了解关于文档对象模型和XML的介绍,参看 http://www.cnblogs.com/xinchrome/p/4890723.html 读取XML 上代码: NSFileHandle *fi ...
随机推荐
- NGUI-制作位图字体以及图文混排
制作字体过程 首先得下载一个位图制作工具Bitmap font generator,可以点击这里下载 1.新建txt文件,输入字体里面包含的文字 2.保存为utf-8格式:点击文件另存为,选择编码格式 ...
- 【quick-cocos2d-x】Lua 语言基础
版权声明:本文为博主原创文章,转载请注明出处. 使用quick-x开发游戏有两年时间了,quick-x是cocos2d-Lua的一个豪华升级版的框架,使用Lua编程.相比于C++,lua的开发确实快速 ...
- UDP模式与TCP模式的区别
1.TCP有连接状态,而UDP没有. 2.TCP应用层使用无需考虑包的大小及发送情况,而UDP需要. 3.TCP中IP包大小的决定者是Socket,而UDP为应用层.
- WCF寄宿方式
WCF开发框架形成之旅---WCF的几种寄宿方式 WCF寄宿方式是一种非常灵活的操作,可以在IIS服务.Windows服务.Winform程序.控制台程序中进行寄宿,从而实现WCF服务的运行,为调用者 ...
- java 开发环境
jdk:包括jre,自己下载即可. 客户端只需安装jre即可. 安装路径:C:\jdk7.0\jdk1.7.0_25\bin (适时更改) 环境变量是从前往后找 测试成功:cmd java ...
- linux下设置SSH无密码登陆
SSH配置 主机cloudgis22.edu.cn:192.168.3.21 主机cloudgis33.edu.cn:192.168.2.174 假设需要配置主机A无密码登录主机A,主机B,先确保所有 ...
- searchBar 隐藏
searchBar 隐藏 CGRect newBounds = self.tableView.bounds; newBounds.origin.y = newBounds.origin.y + _he ...
- C#操作Access的一些小结
C#操作Access的一些小结 好久没有写blog,感觉今年一年都没怎么真正开心过,整天有一些事围绕在身边,使心情难以平静下来,真正写点有意义的东西.博客园是天天看的,看得多,写的少,偶尔也是Copy ...
- poj 2594 Treasure Exploration(最小路径覆盖+闭包传递)
http://poj.org/problem?id=2594 Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total ...
- Problems running django-admin
“command not found: django-admin”¶ django-admin should be on your system path if you installed Djang ...