NSData相当于Java的字节缓冲区。
NSData和NSMutableData存储的是二进制数据,在文件操作,网络,以及核心图形图像中使用较广泛。NSData创建后不可以再修改,NSMutableData可以再次修改。
ByteBuffer其实就是一个字节缓冲区, 在这里你可以对缓冲区的数据进行字节级的操作. 这样的好处在于你可以比较方便的获取到底层的字节操作和字节数据
NSData 和它的可变长子类 NSMutableData 是字节缓冲区的对象化封装。我们可以获得简单缓冲区,并进行一些转换操作。通常我们并不会直接创建字节数据,而是从其他类型的内容转换成字节数据。
所谓简单缓冲区,就是缓冲区内只包含数据,无内嵌指针。
对于 32 位应用程序,NSData 的缓冲区最多可以存储 2GB 数据。对于 64 位应用程序,最多可以存储 8EB(即 8 亿 GB) 数据。
1、NSData 的创建
// 对象方法创建
NSData*data1 = [[NSDataalloc] init];
NSData*data2 = [[NSDataalloc] initWithData:data1];
// 类方法创建NSData*data3 = [NSDatadata];
NSData*data4 = [NSDatadataWithData:data3];
// 由 文件 创建
NSString*filePath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"];
NSData*data5 = [[NSDataalloc] initWithContentsOfFile:filePath];
NSData*data6 = [NSDatadataWithContentsOfFile:filePath];
// 由 URL 创建
NSURL*urlPath = [NSURLURLWithString:[@"file://"stringByAppendingString:[NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"]]];NSData*data7 = [[NSDataalloc] initWithContentsOfURL:urlPath];NSData*data8 = [NSDatadataWithContentsOfURL:urlPath];// 由 字符串 创建NSString*string =@"bei jing nin hao";NSData*data9 = [string dataUsingEncoding:NSUTF8StringEncoding];NSData*data10 = [string dataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];// 可变 NSData 的创建// 初始化时指定对象拥有的字节空间大小,在需要时会增加内存空间,在初始化时并没有分配内存空间NSMutableData*data11 = [[NSMutableDataalloc] initWithCapacity:5];NSMutableData*data12 = [NSMutableDatadataWithCapacity:5];// 初始化时为对象分配指定长度的归零字节NSMutableData*data13 = [[NSMutableDataalloc] initWithLength:10];NSMutableData*data14 = [NSMutableDatadataWithLength:10];
2、NSData 长度的计算
NSData*data1 = [@"bei jing nin hao"dataUsingEncoding:NSUTF8StringEncoding];// 指定空间大小,不分配空间NSMutableData*data2 = [NSMutableDatadataWithCapacity:5];// 分配指定长度的归零字节NSMutableData*data3 = [NSMutableDatadataWithLength:10];// 字节长度的计算,NSData 的 length 属性是只读的NSUIntegerlength1 = data1.length;// 字节长度的计算,NSMutableData 的 length 可以被重新赋值NSUIntegerlength2 = data2.length;NSUIntegerlength3 = data3.length;// 重新设置空间的大小,对象的字节空间会相应的扩充或者截断。如果新设置的大小大于当前大小,会在当前数据的data2.length =15;// 末尾处用归零字节来进行填充。如果新设置的大小小于当前大小,数据会被截断抛弃。data3.length =15;// 扩充指定长度,新添加的空间被设置为归零字节[data2 increaseLengthBy:5]; [data3 increaseLengthBy:5];
3、NSData 数据的获取
NSData*data = [@"bei jing nin hao"dataUsingEncoding:NSUTF8StringEncoding];// 默认为内容数据的十六进制编码NSString*str1 = data.description;NSString*str2 = [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding];NSString*str3 = [[NSStringalloc] initWithBytes:data.bytes length:data.length encoding:NSUTF8StringEncoding];
4、NSData 的比较
NSData*data1 = [@"bei jing nin hao"dataUsingEncoding:NSUTF8StringEncoding];NSData*data2 = [NSDatadataWithData:data1];// 比较两个对象的地址是否一致BOOLbl1 = data1 == data2;// 比较两个对象的长度及每字节的数据是否相同BOOLbl2 = [data1 isEqualToData:data2];
5、NSData 的存储
NSData*data = [@"bei jing nin hao"dataUsingEncoding:NSUTF8StringEncoding];// 将数据写入 fileNSString*filePath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/NSDataTest.txt"];BOOLbl1 = [data writeToFile:filePath atomically:YES];// 将数据写入 URL// 该方法只支持 file:// 路径的文件写入,并不能对远程如 http:// 等类型文件进行写入NSURL*urlPath = [NSURLURLWithString:[@"file://"stringByAppendingString:[NSHomeDirectory() stringByAppendingString:@"/Desktop/NSDataTest.txt"]]];BOOLbl2 = [data writeToURL:urlPath atomically:YES];
6、NSData 与 NSString 的相互转换
NSString*string =@"bei jing nin hao";// NSString 转 NSDataNSData*data = [string dataUsingEncoding:NSUTF8StringEncoding];// data 类型数据以十六进制的形式打印出NSLog(@"%@", data);// data 类型数据以字符串的形式打印出NSLog(@"%s", data.bytes);// NSData 转 NSStringNSString*str = [[NSStringalloc] initWithData:data encoding:NSUTF8StringEncoding];
7.NSData之API
/Base64是一组二进制到文本转化的方案,以ASSCII格式表示二进制数据,这些方案用来编码二进制数据以存储或者通过把多媒体文件转换成文本数据进行传输,这个能保证数据在传输的过程中的完整性。Base64醉常见的用于是处理电子邮件附件,或者解码小图片。在iOS7之前,Base64的编码和解码是需要自己实现的或者是使用第三方库,但是现在苹果提供一些API来实现Base64功能/
//4.base64编码中的一些设置选择
typedefNS_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可选条件,下面选项表示在将诶吗过程中忽略不能识别的字节
typedefNS_OPTIONS(NSUInteger, NSDataBase64DecodingOptions) {
NSDataBase64DecodingIgnoreUnknownCharacters =1UL <<0
}NS_ENUM_AVAILABLE(10_9,7_0);
/****************Immutable Data不可变的Data****************/
@interfaceNSData :NSObject
//6.获取data长度的属性
@property(readonly)NSUIntegerlength;
//7.返回data对象的首指针
@property(readonly)constvoid*bytesNS_RETURNS_INNER_POINTER;
@end
@interfaceNSData (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)searchRangeNS_AVAILABLE(10_6,4_0);
//17.列举遍历字典的方法
- (void) enumerateByteRangesUsingBlock:(void(^)(constvoid*bytes,NSRangebyteRange,BOOL*stop))blockNS_AVAILABLE(10_9,7_0);
@end
/***创建data的所有相关方法作为一个类别几种到一块***/
@interfaceNSData (NSDataCreation)
//18.data的快速创建办法
+ (instancetype)data;
//19.赋值以bytes开头,长度为length的数据,进行初始化使其成为数据对象的内容
+ (instancetype)dataWithBytes:(constvoid*)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:(constvoid*)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,NSUIntegerlength))deallocatorNS_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,你应该使用另外一对方法编码解码一一对应***/
@interfaceNSData (NSDataBase64Encoding)
//36.解码。将已经base64编码之后的字符串数据再转化为NSData数据,
- (instancetype)initWithBase64EncodedString:(NSString*)base64String options:(NSDataBase64DecodingOptions)optionsNS_AVAILABLE(10_9,7_0);
//37.编码。将一个data数据利用base64方案转化成base64之后的NSString字符串
- (NSString*)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)optionsNS_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)optionsNS_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****************/
@interfaceNSMutableData :NSData
//40.可变data的可变字节
@property(readonly)void*mutableBytesNS_RETURNS_INNER_POINTER;
//41.可变data的长度
@propertyNSUIntegerlength;
@end
@interfaceNSMutableData (NSExtendedMutableData)
//42.给可变data追加字节
- (void)appendBytes:(constvoid*)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:(constvoid*)bytes;
//46.重置可变data对应位置的字节
- (void)resetBytesInRange:(NSRange)range;
//47.为可变data设置data数据
- (void)setData:(NSData*)data;
//48.给data替换对应位置的字节, 并且存在替换长度
- (void)replaceBytesInRange:(NSRange)range withBytes:(constvoid*)replacementBytes length:(NSUInteger)replacementLength;
@end0
@interfaceNSMutableData (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读取过程的可选配置条件
typedefNS_OPTIONS(NSUInteger, NSDataReadingOptions) {
NSDataReadingMappedIfSafe =1UL <<0,NSDataReadingUncached =1UL <<1,
NSDataReadingMappedAlwaysNS_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写入过程的可选配置条件
typedefNS_OPTIONS(NSUInteger, NSDataWritingOptions) {
NSDataWritingAtomic =1UL <<0,
NSDataWritingWithoutOverwritingNS_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,
NSDataWritingFileProtectionCompleteUntilFirstUserAuthenticationNS_ENUM_AVAILABLE_IOS(5_0) =0x40000000,
NSDataWritingFileProtectionMaskNS_ENUM_AVAILABLE_IOS(4_0) =0xf0000000,
NSAtomicWrite =NSDataWritingAtomic
};
/****************Data Search Options****************/
//3.data在搜索过程中的可选配置条件
typedefNS_OPTIONS(NSUInteger, NSDataSearchOptions) {
NSDataSearchBackwards =1UL <<0,
NSDataSearchAnchored =1UL <<1
}NS_ENUM_AVAILABLE(10_6,4_0);
/***下方为已废弃代码,不多做解释***/
@interfaceNSData (NSDeprecated)
- (void)getBytes:(void*)bufferNS_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*)pathNS_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*)base64EncodingNS_DEPRECATED(10_6,10_9,4_0,7_0);
@end
/****************Purgeable Data****************/
NS_CLASS_AVAILABLE(10_6,4_0)
@interfaceNSPurgeableData :NSMutableData {
@private
NSUInteger_length;
int32_t_accessCount;
uint8_t_private[32];
void*_reserved;
}
@end