ios 系統庫提供了簡便的api可以實現基礎資料型別和nsdata的轉化,讀data.bytes可以直接獲取到。
以int為例:
// int convert to nsdata
int num =10;
nsdata
*data =
[nsdata datawithbytes:
&num length:
sizeof
(num)];
const uint8_t *bytes =
[data bytes]
;// data convert to int
int num1 =0;
[data getbytes:
&num1 length:data.length]
;nslog
(@"num:%d num1:%d"
,num,num1)
;
datawithbytes:length: 這個方法傳入兩個引數,第乙個引數是記憶體位址。有了記憶體位址,就能夠找到資料儲存的首位置。第二個引數,長度,有了長度就知道資料在記憶體中的offet。
這樣即找到了資料的起始位置,又知道了資料應該讀到**,就能從記憶體中準確地讀取出二進位制資料來了。
getbytes:length: 這個方法讀取資料的時候,得提前知道資料是什麼型別的,給定乙個該型別的記憶體位址,然後知道了需要讀到**(offset)。然後從記憶體中將二進位製流讀出來,儲存到&num1這個給定的位址下,並且儲存為int型別的資料。
nsinter也可以在nsdata,bytes之間轉換:
nsinteger integer =10;
nsdata
*integerdata =
[nsdata datawithbytes:
&integer length:
sizeof
(integer)];
nsinteger integer1 =0;
[integerdata getbytes:
&integer1 length:integerdata.length]
;nslog
(@"integer:%ld integer1:%ld"
,(long)integer,
(long)integer1)
;
有想法的話可以探索一下datawithbytes:length:方法的內部實現。
int num =10;
nsdata
*data =
[nsdata datawithbytes:
&num length:
sizeof
(num)];
nsuinteger len = data.length;
byte
*bytedata =
(byte*)
malloc
(len)
;// 分配出乙個長度為len的記憶體位址
memcpy
(bytedata, data.bytes, len)
;// 將長度為len 的 data.bytes 資料儲存到已經分配好的記憶體下
char *str = "hello world";
nsdata *data = [nsdata datawithbytes:str length:strlen(str)];
nsstring *str1 = [[nsstring alloc] initwithdata:data encoding:nsutf8stringencoding];
OC基礎資料型別 NSSet
1 集合 集合 nsset 和陣列 nsarray 有相似之處,都是儲存不同的物件的位址 不過nsarray是有序的集合,nsset是無序的集合。集合是一種雜湊表,運用雜湊演算法,查詢集合中的元素比陣列速度更快,但是它沒有順序。nsset set nsset alloc initwithobject...
Python 標準資料型別 Bytes
bytes 物件是由單個位元組作為基本元素 8位,取值範圍 0 255 組成的序列,為不可變物件。bytes 物件只負責以二進位制位元組序列的形式記錄所需記錄的物件,至於該物件到底表示什麼 比如到底是什麼字元 則由相應的編碼格式解碼所決定。我們可以通過呼叫 bytes 類 沒錯,它是類,不是函式 生...
Python 標準資料型別 Bytes
bytes 物件是由單個位元組作為基本元素 8位,取值範圍 0 255 組成的序列,為不可變物件。bytes 物件只負責以二進位制位元組序列的形式記錄所需記錄的物件,至於該物件到底表示什麼 比如到底是什麼字元 則由相應的編碼格式解碼所決定。我們可以通過呼叫 bytes 類 沒錯,它是類,不是函式 生...