SDWebImage源碼解讀(一)NSData+ImageContentType

前言
從事iOS開發(fā)有一段時(shí)間了,為了成長鲁冯,決定開始著手寫博客猜极。這一階段中姜,博客主要內(nèi)容是解讀諸如:SDWebImage、AFNetWorking等優(yōu)秀的開源框架跟伏。

這段時(shí)間一直在拜讀博客園大神馬在路上的博客丢胚,他就有關(guān)于SDWebImage的解讀,很詳細(xì)酬姆,把很多值得學(xué)習(xí)的知識(shí)點(diǎn)凸顯了出來嗜桌,我受益匪淺。但是作為新手辞色,這些框架源碼中還是有很多我不太懂的細(xì)節(jié)知識(shí)點(diǎn)骨宠,所以浮定,我的目標(biāo)就是去解讀細(xì)碎的知識(shí)點(diǎn),讓自己能建立一個(gè)更加牢固的基礎(chǔ)知識(shí)體系层亿。歡迎批評指正桦卒!

解讀方法:先從頭文件開始,分析類功能匿又,每個(gè)方法功能方灾,然后解讀.m文件方法的具體實(shí)現(xiàn)。

正文
.h:
復(fù)制代碼
typedef NS_ENUM(NSInteger, SDImageFormat) {
SDImageFormatUndefined = -1,
SDImageFormatJPEG = 0,
SDImageFormatPNG,
SDImageFormatGIF,
SDImageFormatTIFF,
SDImageFormatWebP
};

  • (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data;
    復(fù)制代碼
    這個(gè)類是NSData的分類碌更,分類作用是對類的功能擴(kuò)展裕偿。所以這個(gè)類是用來處理data的。

這個(gè)頭文件很簡單痛单,方法返回SDImageFormat是一個(gè)文件格式嘿棘。

文件頭:

定義:文件頭是位于文件開頭的一段承擔(dān)一定任務(wù)的數(shù)據(jù)。一般都在開頭的部分旭绒。

解釋:文件頭則是直接位于文件中的一段數(shù)據(jù),是文件的一部分鸟妙。計(jì)算機(jī)中的文件有很多類型,而相同類型的文件一般還會(huì)多多少少有一些不同的地方挥吵,文件的類型有EXE,COM,BMP,GIF,WMV,APE,RMVB,FLV,SWF,TXT,CPP,ASM等等重父。當(dāng)然有的文件沒有文件頭,比如TXT忽匈,系統(tǒng)根據(jù)擴(kuò)展名來識(shí)別文件房午,然后用不同的程序來打開這個(gè)文件。但是相同類型的文件也是有不同的地方的脉幢,比如相同一張圖片歪沃,但是文件大小不同嗦锐,而系統(tǒng)就可以根據(jù)文件頭來識(shí)別文件大小嫌松。簡單來說,文件頭是用來區(qū)分文件是什么類型的奕污。

文件頭的類型有很多萎羔,下面列舉一些文件頭:

1.JPG,文件頭:FFD8FFE1

2.PNG碳默,文件頭:89504E47

3.GIF贾陷,文件頭:47494638

4.TIFF,文件頭:49492A00

5.WebP嘱根,文件頭:524946462A73010057454250

.m文件
下面我們看.m文件

復(fù)制代碼
1 + (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data {
2 if (!data) {
3 return SDImageFormatUndefined;
4 }
5
6 uint8_t c;
7 [data getBytes:&c length:1];
8 switch (c) {
9 case 0xFF:
10 return SDImageFormatJPEG;
11 case 0x89:
12 return SDImageFormatPNG;
13 case 0x47:
14 return SDImageFormatGIF;
15 case 0x49:
16 case 0x4D:
17 return SDImageFormatTIFF;
18 case 0x52:
19 // R as RIFF for WEBP
20 if (data.length < 12) {
21 return SDImageFormatUndefined;
22 }
23
24 NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
25 if ([testString hasPrefix:@"RIFF"] && [testString hasSuffix:@"WEBP"]) {
26 return SDImageFormatWebP;
27 }
28 }
29 return SDImageFormatUndefined;
30 }
復(fù)制代碼
這里我們進(jìn)行逐行解讀:

unit8_t c髓废;點(diǎn)擊跳轉(zhuǎn)我們可以看到

typedef unsigned char uint8_t;
typedef的意思就是,用后者代替前者该抒。用unit8_t來表示無符號char慌洪。而char在C語言中表示字符型,長度為一個(gè)字節(jié)。

[data getBytes:&c length:1];點(diǎn)擊跳轉(zhuǎn)我們可以看到
1 - (void)getBytes:(void *)buffer length:(NSUInteger)length;
這個(gè)是NSData的方法冈爹,這個(gè)方法的作用是取出length個(gè)字節(jié)涌攻,存入buffer中。所以這行代碼的作用是频伤,取出文件data的第一個(gè)字節(jié)恳谎,然后存入c中。

接下來憋肖,我們可以看到是switch分支語句因痛,判斷取出的這個(gè)字節(jié)的內(nèi)容,返回對應(yīng)的文件格式岸更。

當(dāng)c==0x52時(shí)婚肆,判斷了data的長度,如果長度小于12坐慰,則此文件一定不是WebP较性。

NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
如果大于12,則取出0-12個(gè)字節(jié)的數(shù)據(jù)结胀,然后轉(zhuǎn)為ASCII編碼赞咙,判斷字符串,若字符串是以RIFF開頭糟港,或者以WEBP結(jié)尾攀操,則文件為WebP格式。

總結(jié):
這個(gè)類功能比較簡單秸抚,就是根據(jù)文件二進(jìn)制數(shù)據(jù)速和,返回文件格式。是利用分類對NSData進(jìn)行功能擴(kuò)展剥汤。

轉(zhuǎn)載:http://www.cnblogs.com/cbios/p/7350995.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末颠放,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吭敢,更是在濱河造成了極大的恐慌碰凶,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹿驼,死亡現(xiàn)場離奇詭異欲低,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)畜晰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評論 3 399
  • 文/潘曉璐 我一進(jìn)店門砾莱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凄鼻,你說我怎么就攤上這事腊瑟∶婧撸” “怎么了?”我有些...
    開封第一講書人閱讀 167,990評論 0 360
  • 文/不壞的土叔 我叫張陵扫步,是天一觀的道長魔策。 經(jīng)常有香客問我,道長河胎,這世上最難降的妖魔是什么闯袒? 我笑而不...
    開封第一講書人閱讀 59,618評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮游岳,結(jié)果婚禮上政敢,老公的妹妹穿的比我還像新娘。我一直安慰自己胚迫,他們只是感情好喷户,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著访锻,像睡著了一般褪尝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上期犬,一...
    開封第一講書人閱讀 52,246評論 1 308
  • 那天河哑,我揣著相機(jī)與錄音,去河邊找鬼龟虎。 笑死璃谨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鲤妥。 我是一名探鬼主播佳吞,決...
    沈念sama閱讀 40,819評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棉安!你這毒婦竟也來了底扳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,725評論 0 276
  • 序言:老撾萬榮一對情侶失蹤垂券,失蹤者是張志新(化名)和其女友劉穎花盐,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體菇爪,經(jīng)...
    沈念sama閱讀 46,268評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評論 3 340
  • 正文 我和宋清朗相戀三年柒昏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凳宙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡职祷,死狀恐怖氏涩,靈堂內(nèi)的尸體忽然破棺而出届囚,到底是詐尸還是另有隱情,我是刑警寧澤是尖,帶...
    沈念sama閱讀 36,181評論 5 350
  • 正文 年R本政府宣布意系,位于F島的核電站,受9級特大地震影響饺汹,放射性物質(zhì)發(fā)生泄漏蛔添。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評論 3 333
  • 文/蒙蒙 一兜辞、第九天 我趴在偏房一處隱蔽的房頂上張望迎瞧。 院中可真熱鬧,春花似錦逸吵、人聲如沸凶硅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽足绅。三九已至,卻和暖如春韩脑,著一層夾襖步出監(jiān)牢的瞬間编检,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評論 1 272
  • 我被黑心中介騙來泰國打工扰才, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留允懂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評論 3 376
  • 正文 我出身青樓衩匣,卻偏偏與公主長得像蕾总,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子琅捏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評論 2 359

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