? ? ?? NSData:(官方文檔描述:A byte buffer in memory)瞭恰。
?????? 遵循NSCopying NSCoding協(xié)議,它提供面向?qū)ο蟮臄?shù)組存儲為字節(jié) , 適用與讀寫文件蟋字,而讀寫文件的時候需要一個緩沖區(qū)嫌松,而NSData就提供了這么一個緩存區(qū) 。
什么鬼痘括,太書面了,還是看不懂滔吠,那我們就從最基本的NSString -> NSData一探究竟纲菌!
一.首先介紹幾個編碼表/字符集
??????? 1). ASCII碼表
???? (American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng)疮绷,主要用于顯示現(xiàn)代英語和其他西歐語言翰舌。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),并等同于國際標(biāo)準(zhǔn)ISO/IEC 646矗愧。
??????? 2).Unicode碼
? ? ? ? Unicode只有一個字符集灶芝,中、日唉韭、韓的三種文字占用了Unicode中0x3000到0x9FFF的部分? Unicode目前普遍采用的是UCS-2,它用兩個字節(jié)來編碼一個字符,包括英文字符夜涕, 比如漢字"經(jīng)"的編碼是0x7ECF,注意字符碼一般用十六進制來 表示,為了與十進制區(qū)分属愤,十六進制以0x開頭女器,0x7ECF轉(zhuǎn)換成十進制 就是32463,UCS-2用兩個字節(jié)來編碼字符,兩個字節(jié)就是16位二進制住诸, 2的16次方等于65536,所以UCS-2最多能編碼65536個字符驾胆。 編碼從0到127的字符與ASCII編碼的字符一樣涣澡,比如字母"a"的Unicode 編碼是0x0061,十進制是97,而"a"的ASCII編碼是0x61,十進制也是97, 對于漢字的編碼,事實上Unicode對漢字支持不怎么好丧诺,這也是沒辦法的入桂, 簡體和繁體總共有六七萬個漢字,而UCS-2最多能表示65536個驳阎,才六萬 多個抗愁,所以Unicode只能排除一些幾乎不用的漢字,好在常用的簡體漢字 也不過七千多個呵晚,為了能表示所有漢字蜘腌,Unicode也有UCS-4規(guī)范,就是用 4個字節(jié)來編碼字符饵隙。目前撮珠,在網(wǎng)絡(luò)、Windows系統(tǒng)和很多大型軟件中得到應(yīng)用金矛。
?????? 3).UTF-8
? ? (8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼芯急,又稱萬國碼。由KenThompson于1992年創(chuàng)建”疗猓現(xiàn)在已經(jīng)標(biāo)準(zhǔn)化為RFC3629志于。UTF-8用1到6個字節(jié)編碼Unicode字符。用在網(wǎng)頁上可以統(tǒng)一頁面顯示中文簡體繁體及其它語言(如英文废睦,日文伺绽,韓文)。但是嗜湃,Unicode支持歐洲奈应、非洲、中東购披、亞洲(包括統(tǒng)一標(biāo)準(zhǔn)的東亞象形漢字和韓國表音文字, Unicode并沒有提供對諸如Braille,Cherokee, Ethiopic, Khmer, Mongolian, Hmong, Tai Lu, Tai Mau文字的支持杖挣。同時它也不支持如Ahom, Akkadian, Aramaic,BabylonianCuneiform, Balti, Brahmi, Etruscan, Hittite, Javanese, Numidian, Old Persian Cuneiform, Syrian之類的古老文字。UTF-8一般用三個字節(jié)來編碼一個漢字刚陡,一個字節(jié)來編碼英文
????? 簡單理解:? ASCII碼是基礎(chǔ)惩妇,Unicode和UTF-8是擴展, 且UTF-8覆蓋面更廣。
二.上代碼講解
?1.NSString ->NSData
NSString *testString = @"123我經(jīng)";
NSData *testData = [testString dataUsingEncoding: NSUTF8StringEncoding];
NSLog(@"-testData:%@--%ld", testData, testData.length);
日志輸出:<313233e6 8891e7bb 8f>-長度:9
分析:
? ? ? ? 依照上面介紹的碼表筐乳,單字符1歌殃,2,3在utf-8編碼占1個字節(jié)蝙云,漢字字符utf-8編碼占3個字節(jié)氓皱,那么剛好長度為9個字節(jié)。
那<313233e6 8891e7bb 8f>這些是什么東西,那我們繼續(xù)執(zhí)行以下代碼
Byte *testByte = (Byte *)[testData bytes];
for(int i=0;i<[testData length];i++){
??????? printf("testByte = %d\n----%ld",testByte[i], sizeof(testByte[i]));
}
輸出日志:
--1--testByte = 49
--1--testByte = 50
--1--testByte = 51
--1--testByte = 230
--1--testByte = 136
--1--testByte = 145
--1--testByte = 231
--1--testByte = 187
--1--testByte = 143
??????? 根據(jù)ACSII碼表可以發(fā)現(xiàn)上面打印出來的就是10進制的字符 1波材,2股淡,3; 再看剛剛打印的NSData *testData <313233e6 8891e7bb 8f>不難看出廷区,31唯灵,32,33其實就是字符1隙轻,2早敬,3的16進制表示形式。
所以得出結(jié)論:NSData里面存的數(shù)據(jù)就是字節(jié)流大脉,4個字節(jié)會有一個空格,但是并不是按10進制存的水孩,是轉(zhuǎn)為了16進制镰矿。
擴展:
剛剛打印*testByte時,該指針指向的是存字節(jié)Byte的數(shù)組俘种,
Byte:是計算機信息技術(shù)用于計量存儲容量的一種計量單位秤标,范圍 0~255(10進制),其實就是unsigned char(無符號字符類型)宙刘。轉(zhuǎn)換如下:typedef unsigned char? ? ? ? ? ? ? ? ? UInt8;
typedef UInt8? ? ? ? ? ? ? ? ? ? ? ? ? Byte;
那后面的漢字 “我經(jīng)”通過找一個utf-8的解碼工具看看:
看到了吧:-testData:<313233e6 8891e7bb 8f>是不是與上圖剛好吻合苍姜。
到此已經(jīng)把NSString轉(zhuǎn)NSData的過程講完了,我們改一下代碼悬包,使用unicode編碼嘗試看看衙猪。