Foundation對象類型之NSData

NSData相當于Java的字節(jié)緩沖區(qū)。
NSData和NSMutableData存儲的是二進制數據,在文件操作,網絡,以及核心圖形圖像中使用較廣泛。NSData創(chuàng)建后不可以再修改,NSMutableData可以再次修改。
ByteBuffer其實就是一個字節(jié)緩沖區(qū), 在這里你可以對緩沖區(qū)的數據進行字節(jié)級的操作. 這樣的好處在于你可以比較方便的獲取到底層的字節(jié)操作和字節(jié)數據
NSData 和它的可變長子類 NSMutableData 是字節(jié)緩沖區(qū)的對象化封裝。我們可以獲得簡單緩沖區(qū),并進行一些轉換操作。通常我們并不會直接創(chuàng)建字節(jié)數據,而是從其他類型的內容轉換成字節(jié)數據。
所謂簡單緩沖區(qū),就是緩沖區(qū)內只包含數據,無內嵌指針。
對于 32 位應用程序,NSData 的緩沖區(qū)最多可以存儲 2GB 數據。對于 64 位應用程序,最多可以存儲 8EB(即 8 億 GB) 數據。
1、NSData 的創(chuàng)建
// 對象方法創(chuàng)建

NSData*data1 = [[NSDataalloc] init];
NSData*data2 = [[NSDataalloc] initWithData:data1];
// 類方法創(chuàng)建NSData*data3 = [NSDatadata];
NSData*data4 = [NSDatadataWithData:data3];

// 由 文件 創(chuàng)建

NSString*filePath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/test.txt"];
NSData*data5 = [[NSDataalloc] initWithContentsOfFile:filePath];
NSData*data6 = [NSDatadataWithContentsOfFile:filePath];

// 由 URL 創(chuàng)建

NSURL*urlPath = [NSURLURLWithString:[@"file://"stringByAppendingString:[NSHomeDirectory()                                                      stringByAppendingString:@"/Desktop/test.txt"]]];NSData*data7 = [[NSDataalloc] initWithContentsOfURL:urlPath];NSData*data8 = [NSDatadataWithContentsOfURL:urlPath];// 由 字符串 創(chuàng)建NSString*string =@"bei jing nin hao";NSData*data9 = [string dataUsingEncoding:NSUTF8StringEncoding];NSData*data10 = [string dataUsingEncoding:NSUTF8StringEncodingallowLossyConversion:YES];// 可變 NSData 的創(chuàng)建// 初始化時指定對象擁有的字節(jié)空間大小,在需要時會增加內存空間,在初始化時并沒有分配內存空間NSMutableData*data11 = [[NSMutableDataalloc] initWithCapacity:5];NSMutableData*data12 = [NSMutableDatadataWithCapacity:5];// 初始化時為對象分配指定長度的歸零字節(jié)NSMutableData*data13 = [[NSMutableDataalloc] initWithLength:10];NSMutableData*data14 = [NSMutableDatadataWithLength:10];

2、NSData 長度的計算

NSData*data1 = [@"bei jing nin hao"dataUsingEncoding:NSUTF8StringEncoding];// 指定空間大小,不分配空間NSMutableData*data2 = [NSMutableDatadataWithCapacity:5];// 分配指定長度的歸零字節(jié)NSMutableData*data3 = [NSMutableDatadataWithLength:10];// 字節(jié)長度的計算,NSData 的 length 屬性是只讀的NSUIntegerlength1 = data1.length;// 字節(jié)長度的計算,NSMutableData 的 length 可以被重新賦值NSUIntegerlength2 = data2.length;NSUIntegerlength3 = data3.length;// 重新設置空間的大小,對象的字節(jié)空間會相應的擴充或者截斷。如果新設置的大小大于當前大小,會在當前數據的data2.length =15;// 末尾處用歸零字節(jié)來進行填充。如果新設置的大小小于當前大小,數據會被截斷拋棄。data3.length =15;// 擴充指定長度,新添加的空間被設置為歸零字節(jié)[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;// 比較兩個對象的長度及每字節(jié)的數據是否相同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可選條件,下面選項表示在將誒嗎過程中忽略不能識別的字節(jié)
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中指定長度的字節(jié)存入buffer這個提前聲明的數組中
- (void)getBytes:(void*)buffer length:(NSUInteger)length;
//9.取出data中指定位置range的字節(jié)存入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
/***創(chuàng)建data的所有相關方法作為一個類別幾種到一塊***/
@interfaceNSData (NSDataCreation)
//18.data的快速創(chuàng)建辦法
+ (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來創(chuàng)建一個新的NSData對象,參數可以是NSMutableData對象。
- (instancetype)initWithData:(NSData*)data;
//35.用指定的NSData對象aData來創(chuàng)建一個新的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的可變字節(jié)
@property(readonly)void*mutableBytesNS_RETURNS_INNER_POINTER;
//41.可變data的長度
@propertyNSUIntegerlength;
@end
@interfaceNSMutableData (NSExtendedMutableData)
//42.給可變data追加字節(jié)
- (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替換對應位置的字節(jié)
- (void)replaceBytesInRange:(NSRange)range withBytes:(constvoid*)bytes;
//46.重置可變data對應位置的字節(jié)
- (void)resetBytesInRange:(NSRange)range;
//47.為可變data設置data數據
- (void)setData:(NSData*)data;
//48.給data替換對應位置的字節(jié), 并且存在替換長度
- (void)replaceBytesInRange:(NSRange)range withBytes:(constvoid*)replacementBytes length:(NSUInteger)replacementLength;
@end0
@interfaceNSMutableData (NSMutableDataCreation)
//49.動態(tài)創(chuàng)建可變data并且初始化指定大小
+ (instancetype)dataWithCapacity:(NSUInteger)aNumItems;
//50.動態(tài)創(chuàng)建可變data并且初始化指定長度
+ (instancetype)dataWithLength:(NSUInteger)length;
//51.靜態(tài)創(chuàng)建可變data并且初始化指定大小
- (instancetype)initWithCapacity:(NSUInteger)capacity;
//52.靜態(tài)創(chuàng)建可變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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容