SDWebImage源码解读(一)NSData+ImageContentType

前言
从事iOS开发有一段时间了,为了成长,决定开始着手写博客。这一阶段,博客主要内容是解读诸如:SDWebImage、AFNetWorking等优秀的开源框架。

这段时间一直在拜读博客园大神马在路上的博客,他就有关于SDWebImage的解读,很详细,把很多值得学习的知识点凸显了出来,我受益匪浅。但是作为新手,这些框架源码中还是有很多我不太懂的细节知识点,所以,我的目标就是去解读细碎的知识点,让自己能建立一个更加牢固的基础知识体系。欢迎批评指正!

解读方法:先从头文件开始,分析类功能,每个方法功能,然后解读.m文件方法的具体实现。

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

  • (SDImageFormat)sd_imageFormatForImageData:(nullable NSData *)data;
    复制代码
    这个类是NSData的分类,分类作用是对类的功能扩展。所以这个类是用来处理data的。

这个头文件很简单,方法返回SDImageFormat是一个文件格式。

文件头:

定义:文件头是位于文件开头的一段承担一定任务的数据。一般都在开头的部分。

解释:文件头则是直接位于文件中的一段数据,是文件的一部分。计算机中的文件有很多类型,而相同类型的文件一般还会多多少少有一些不同的地方,文件的类型有EXE,COM,BMP,GIF,WMV,APE,RMVB,FLV,SWF,TXT,CPP,ASM等等。当然有的文件没有文件头,比如TXT,系统根据扩展名来识别文件,然后用不同的程序来打开这个文件。但是相同类型的文件也是有不同的地方的,比如相同一张图片,但是文件大小不同,而系统就可以根据文件头来识别文件大小。简单来说,文件头是用来区分文件是什么类型的。

文件头的类型有很多,下面列举一些文件头:

1.JPG,文件头:FFD8FFE1

2.PNG,文件头:89504E47

3.GIF,文件头:47494638

4.TIFF,文件头:49492A00

5.WebP,文件头:524946462A73010057454250

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

复制代码
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 }
复制代码
这里我们进行逐行解读:

unit8_t c;点击跳转我们可以看到

typedef unsigned char uint8_t;
typedef的意思就是,用后者代替前者。用unit8_t来表示无符号char。而char在C语言中表示字符型,长度为一个字节。

[data getBytes:&c length:1];点击跳转我们可以看到
1 - (void)getBytes:(void *)buffer length:(NSUInteger)length;
这个是NSData的方法,这个方法的作用是取出length个字节,存入buffer中。所以这行代码的作用是,取出文件data的第一个字节,然后存入c中。

接下来,我们可以看到是switch分支语句,判断取出的这个字节的内容,返回对应的文件格式。

当c==0x52时,判断了data的长度,如果长度小于12,则此文件一定不是WebP。

NSString *testString = [[NSString alloc] initWithData:[data subdataWithRange:NSMakeRange(0, 12)] encoding:NSASCIIStringEncoding];
如果大于12,则取出0-12个字节的数据,然后转为ASCII编码,判断字符串,若字符串是以RIFF开头,或者以WEBP结尾,则文件为WebP格式。

总结:
这个类功能比较简单,就是根据文件二进制数据,返回文件格式。是利用分类对NSData进行功能扩展。

转载:http://www.cnblogs.com/cbios/p/7350995.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容