OC 基礎資料型別轉bytes

2021-10-21 20:18:03 字數 1824 閱讀 2388

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 類 沒錯,它是類,不是函式 生...