Base64的常用API

文/li大鵬(簡書作者)
原文鏈接:http://www.reibang.com/p/c7979bf62154
本文是我粘貼上述簡書作者的,我對文章進(jìn)行了簡單的排版,方便大家閱讀,也便于自己學(xué)習(xí),希望原作者不會(huì)介意

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

Base64是一組二進(jìn)制到文本轉(zhuǎn)化的方案靶庙,以ASSCII格式表示二進(jìn)制數(shù)據(jù),這些方案用來編碼二進(jìn)制數(shù)據(jù)以存儲(chǔ)或者通過把多媒體文件轉(zhuǎn)換成文本數(shù)據(jù)進(jìn)行傳輸泣矛,這個(gè)能保證數(shù)據(jù)在傳輸?shù)倪^程中的完整性矗漾。Base64醉常見的用于是處理電子郵件附件,或者解碼小圖片杜恰。在iOS7之前获诈,Base64的編碼和解碼是需要自己實(shí)現(xiàn)的或者是使用第三方庫,但是現(xiàn)在蘋果提供一些API來實(shí)現(xiàn)Base64功能

//4.base64編碼中的一些設(shè)置選擇

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可選條件,下面選項(xiàng)表示在解碼過程中忽略不能識別的字節(jié)

typedefNS_OPTIONS(NSUInteger, NSDataBase64DecodingOptions) {

NSDataBase64DecodingIgnoreUnknownCharacters =1UL <<0

}NS_ENUM_AVAILABLE(10_9,7_0);

/****************Immutable Data不可變的Data****************/
//6.獲取data長度的屬性

@property(readonly)NSUIntegerlength;

//7.返回data對象的首指針

@property(readonly)constvoid*bytesNS_RETURNS_INNER_POINTER;

@end

@interfaceNSData (NSExtendedData)

//8.返回一個(gè)ASCII編碼格式的字符串心褐,采用的格式是data屬性列表的格式舔涎。

@property(readonly,copy)NSString*description;

//9.取出data中指定長度的字節(jié)存入buffer這個(gè)提前聲明的數(shù)組中

- (void)getBytes:(void*)buffer length:(NSUInteger)length;

//9.取出data中指定位置range的字節(jié)存入buffer這個(gè)提前聲明的數(shù)組中

- (void)getBytes:(void*)buffer range:(NSRange)range;

//10.判斷兩個(gè)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寫入指定文件,并且有寫入過程的設(shè)置條件逗爹,帶錯(cuò)誤信息

- (BOOL)writeToFile:(NSString*)path options:(NSDataWritingOptions)writeOptionsMask error:(NSError**)errorPtr;

//15.將data寫入指定的url亡嫌,并且有寫入過程的設(shè)置條件,帶錯(cuò)誤信息

- (BOOL)writeToURL:(NSURL*)url options:(NSDataWritingOptions)writeOptionsMask error:(NSError**)errorPtr;

//16.搜索在data1內(nèi)部存在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的所有相關(guān)方法作為一個(gè)類別幾種到一塊/

@interfaceNSData (NSDataCreation)

//18.data的快速創(chuàng)建辦法

+ (instancetype)data;

//19.賦值以bytes開頭匾旭,長度為length的數(shù)據(jù),進(jìn)行初始化使其成為數(shù)據(jù)對象的內(nèi)容

+ (instancetype)dataWithBytes:(constvoid*)bytes length:(NSUInteger)length;

//20.這個(gè)方法生成的data中保存的是指向數(shù)據(jù)的指針圃郊,并沒有對數(shù)據(jù)進(jìn)行復(fù)制操作价涝。

+ (instancetype)dataWithBytesNoCopy:(void*)bytes length:(NSUInteger)length;

//21.這個(gè)方法生成的data中保存的是指向數(shù)據(jù)的指針,并沒有對數(shù)據(jù)進(jìn)行復(fù)制操作持舆。當(dāng)flag為yes的時(shí)候色瘩,生成的data對象是bytes的所有者,當(dāng)data對象被釋放的時(shí)候也會(huì)同時(shí)釋放bytes逸寓,所以bytes必須是通過malloc在堆上分配的內(nèi)存居兆。當(dāng)flag為no的時(shí)候,bytes不會(huì)被自動(dòng)釋放竹伸,釋放bytes時(shí)要注意時(shí)機(jī)泥栖,不要再data對象還被使用的時(shí)候釋放bytes。

+ (instancetype)dataWithBytesNoCopy:(void*)bytes length:(NSUInteger)length freeWhenDone:(BOOL)b;

//22.加載file文件勋篓,并且有可選擇讀取文件的選項(xiàng)配置條件吧享,帶有錯(cuò)誤信息

+ (instancetype)dataWithContentsOfFile:(NSString*)path options:(NSDataReadingOptions)readOptionsMask error:(NSError**)errorPtr;

//23.加載url,并且有可選擇讀取文件的選項(xiàng)配置條件譬嚣,帶有錯(cuò)誤信息

+ (instancetype)dataWithContentsOfURL:(NSURL*)url options:(NSDataReadingOptions)readOptionsMask error:(NSError**)errorPtr;

//24.從參數(shù)path指定的文件讀入二進(jìn)制數(shù)據(jù)钢颂,用該數(shù)據(jù)初始化NSData對象。

+ (instancetype)dataWithContentsOfFile:(NSString*)path;

//25.從參數(shù)path指定的url讀入拜银,用該數(shù)據(jù)初始化NSData對象殊鞭。

+ (instancetype)dataWithContentsOfURL:(NSURL*)url;

//26.賦值以bytes開頭,長度為length的數(shù)據(jù)尼桶,進(jìn)行初始化使其成為數(shù)據(jù)對象的內(nèi)容

- (instancetype)initWithBytes:(constvoid*)bytes length:(NSUInteger)length;

//27.這個(gè)方法生成的data中保存的是指向數(shù)據(jù)的指針操灿,并沒有對數(shù)據(jù)進(jìn)行復(fù)制操作。

- (instancetype)initWithBytesNoCopy:(void*)bytes length:(NSUInteger)length;

//28.這個(gè)方法生成的data中保存的是指向數(shù)據(jù)的指針疯汁,并沒有對數(shù)據(jù)進(jìn)行復(fù)制操作牲尺。當(dāng)flag為yes的時(shí)候卵酪,生成的data對象是bytes的所有者幌蚊,當(dāng)data對象被釋放的時(shí)候也會(huì)同時(shí)釋放bytes,所以bytes必須是通過malloc在堆上分配的內(nèi)存溃卡。當(dāng)flag為no的時(shí)候溢豆,bytes不會(huì)被自動(dòng)釋放,釋放bytes時(shí)要注意時(shí)機(jī)瘸羡,不要再data對象還被使用的時(shí)候釋放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.從參數(shù)path指定的文件讀入二進(jìn)制數(shù)據(jù),用該數(shù)據(jù)初始化NSData對象。如果讀取文件失敗队他,則釋放調(diào)用者并返回nil卷仑,同時(shí)把錯(cuò)誤信息寫入指針errorPtr。mask是一個(gè)選項(xiàng)信息麸折,用于指定是否使用虛擬內(nèi)存等锡凝。

- (instancetype)initWithContentsOfFile:(NSString*)path options:(NSDataReadingOptions)readOptionsMask error:(NSError**)errorPtr;

//31.從參數(shù)url指定的路徑中讀入,用該數(shù)據(jù)初始化NSData對象垢啼。如果讀取文件失敗窜锯,則釋放調(diào)用者并返回nil,同時(shí)把錯(cuò)誤信息寫入指針errorPtr芭析。mask是一個(gè)選項(xiàng)信息锚扎,用于指定是否使用虛擬內(nèi)存等。

- (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)建一個(gè)新的NSData對象馁启,參數(shù)可以是NSMutableData對象驾孔。

- (instancetype)initWithData:(NSData*)data;

//35.用指定的NSData對象aData來創(chuàng)建一個(gè)新的NSData對象,參數(shù)可以是NSMutableData對象惯疙。

+ (instancetype)dataWithData:(NSData*)data;

@end

/*** base64方案編碼分類 iOS7之后蘋果給出以下四個(gè)API供實(shí)現(xiàn)base64方案 頭兩個(gè)是處理字符串的助币,后兩個(gè)是處理UTF-8編碼數(shù)據(jù)的,這兩個(gè)承兌的方法功能是一樣的螟碎,但是有時(shí)候用其中一個(gè)比另一個(gè)效率要高眉菱。如果你像要bae64編碼字符串然后寫進(jìn)文件,你應(yīng)該使用UTF-8編碼數(shù)據(jù)的這對方法掉分。如果你打算base64編碼字符串之后用作json俭缓,你應(yīng)該使用另外一對方法編碼解碼一一對應(yīng)***/

@interfaceNSData (NSDataBase64Encoding)

//36.解碼。將已經(jīng)base64編碼之后的字符串?dāng)?shù)據(jù)再轉(zhuǎn)化為NSData數(shù)據(jù)酥郭,

- (instancetype)initWithBase64EncodedString:(NSString*)base64String options:(NSDataBase64DecodingOptions)optionsNS_AVAILABLE(10_9,7_0);

//37.編碼华坦。將一個(gè)data數(shù)據(jù)利用base64方案轉(zhuǎn)化成base64之后的NSString字符串

- (NSString*)base64EncodedStringWithOptions:(NSDataBase64EncodingOptions)optionsNS_AVAILABLE(10_9,7_0);

//38.解碼。將已經(jīng)base64編碼之后的NSData數(shù)據(jù)再轉(zhuǎn)化為NSData數(shù)據(jù)

- (instancetype)initWithBase64EncodedData:(NSData*)base64Data options:(NSDataBase64DecodingOptions)optionsNS_AVAILABLE(10_9,7_0);

//39.編碼.將一個(gè)data數(shù)據(jù)利用base64方案轉(zhuǎn)化成base64之后的NSData數(shù)據(jù)

- (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****************/

//40.可變data的可變字節(jié)

@property(readonly)void*mutableBytesNS_RETURNS_INNER_POINTER;

//41.可變data的長度

//42.給可變data追加字節(jié)

- (void)appendBytes:(constvoid*)bytes length:(NSUInteger)length;

//43.給data追加其他的data

- (void)appendData:(NSData*)other;

//44.為已經(jīng)存在的data追加新的長度

- (void)increaseLengthBy:(NSUInteger)extraLength;

示例程序:

NSMutableData * data = [NSMutableData data];

[data increaseLengthBy:5];

NSLog(@"dataLength———%lu",(unsigned long)data.length);

//45.給data替換對應(yīng)位置的字節(jié)

- (void)replaceBytesInRange:(NSRange)range withBytes:(constvoid*)bytes;

//46.重置可變data對應(yīng)位置的字節(jié)

- (void)resetBytesInRange:(NSRange)range;

//47.為可變data設(shè)置data數(shù)據(jù)

- (void)setData:(NSData*)data;

//48.給data替換對應(yīng)位置的字節(jié), 并且存在替換長度

- (void)replaceBytesInRange:(NSRange)range withBytes:(constvoid*)replacementBytes length:(NSUInteger)replacementLength;
@interfaceNSMutableData (NSMutableDataCreation)

//49.動(dòng)態(tài)創(chuàng)建可變data并且初始化指定大小

+ (instancetype)dataWithCapacity:(NSUInteger)aNumItems;

//50.動(dòng)態(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;

//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);

文/li大鵬(簡書作者)
原文鏈接:http://www.reibang.com/p/c7979bf62154

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市椿息,隨后出現(xiàn)的幾起案子歹袁,更是在濱河造成了極大的恐慌,老刑警劉巖寝优,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件条舔,死亡現(xiàn)場離奇詭異,居然都是意外死亡乏矾,警方通過查閱死者的電腦和手機(jī)孟抗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進(jìn)店門迁杨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凄硼,你說我怎么就攤上這事铅协。” “怎么了摊沉?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵警医,是天一觀的道長。 經(jīng)常有香客問我坯钦,道長预皇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任婉刀,我火速辦了婚禮吟温,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘突颊。我一直安慰自己鲁豪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布律秃。 她就那樣靜靜地躺著爬橡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪棒动。 梳的紋絲不亂的頭發(fā)上糙申,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機(jī)與錄音船惨,去河邊找鬼柜裸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛粱锐,可吹牛的內(nèi)容都是我干的疙挺。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼怜浅,長吁一口氣:“原來是場噩夢啊……” “哼铐然!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起恶座,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤搀暑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后奥裸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體险掀,經(jīng)...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年湾宙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樟氢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,683評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侠鳄,死狀恐怖埠啃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伟恶,我是刑警寧澤碴开,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站博秫,受9級特大地震影響潦牛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挡育,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一巴碗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧即寒,春花似錦橡淆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凹嘲,卻和暖如春师倔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背周蹭。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工溯革, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谷醉。 一個(gè)月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓致稀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親俱尼。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,566評論 2 349

推薦閱讀更多精彩內(nèi)容