iOS中使用結構體與位域,大小端資料轉換

2021-09-02 00:17:08 字數 719 閱讀 1318

在定義結構體時,如果不涉及到oc中的物件時,可以直接將結構體當作成員變數屬性使用,一旦在結構中定義了oc中的物件,編譯會報錯,提示「arc時禁止在結構體中定義oc的物件」,主要原因在於arc無法管理結構體中的oc物件的生命週期以記憶體。可以從以下幾個方面分析:

位域定義如下:

typedef struct teststruct;
位域的定義形式為:型別說明符號 位網域名稱:位域長度

這裡的位域長度單位是 bit 位,而不是位元組數,正因為如此,在某些記憶體要求比較高的場景中,通過位域可以節省一定的記憶體。

注意:位域是從低位向最高位分配記憶體的

大端對齊資料(網路順序)

小端對齊資料(主機順序)

資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址中,這種儲存模式將位址的高低和資料位權有效地結合起來,高位址部分權值高,低位址部分權值低。(簡單的來說就是反過來存放資料了)

在ios中可以通過 ntohl(x) 與 htonl(x) 函式實現大小端資料之間的轉換,net to host long(返回值) 或者 host to net long(返回值)

- (nsdata *)intnettohostdata:(int)i

結構體與位域的使用

c語言結構體對齊也是老生常談的話題了。基本上是面試題的必考題。內容雖然很基礎,但一不小心就會弄錯。寫出乙個struct,然後sizeof,你會不會經常對結果感到奇怪?sizeof的結果往往都比你宣告的變數總長度要大,這是怎麼回事呢?開始學的時候,也被此類問題困擾很久。其實相關的文章很多,感覺說清楚的...

結構體的大小及結構體之位域

結構體的大小 規則1 結構體的大小等於結構體內最大型別的整數倍 規則3 為了滿足規則1和2在結構體成員之後進行位元組填充 結構體位域的大小規則 共用體 為了提速之類的,在結構體和聯合體的記憶體塊中,是按照一定的規則安排的 聯合體 聯合體的記憶體不會為了所有成員安排,而是只取最大的成員的所需記憶體大小...

結構體大小計算與位域大小計算

本博文純屬個人理解,有錯誤請多指正。首先,各個變數所佔的位元組 型別位元組 64位 位元組 32位 char11 unsigned char11 short22 unsigned short22 int4 4unsigned int44 long84 unsigned long84 float44 ...