iOS IM開發準備工作(五)iOS中的struct怎麼處理,iosstruct

來源:互聯網
上載者:User

iOS IM開發準備工作(五)iOS中的struct怎麼處理,iosstruct

  iOS中需要處理結構體的機會應該不多:Blueteeth or socket and so on。。。

  不過,有一天你還是會遇到的。

定長結構體

  所謂定長的結構體是,結構體內每一個欄位都規定了位元組長度。如int、long、double、char[32]等等。下面是一個定長結構體的例子。

typedef struct tagInfo{    int  nFace;    long cmd;    char sNickName[60];    char sAccountNo[60];}T_INFO,*PT_INFO;

  個人覺得,結構體是一段有序的二進位文本。也就是它的每一個欄位都是按順序排列的。

   // 賦值    tagInfo * tinfo;    tinfo->nFace = 0;    memcpy(tinfo->sAccountNo, [@"xxx" UTF8String], 60);    memcpy(tinfo->sNickName, [@"xxx" UTF8String], 60);    tinfo->cmd = 10;
    // 處理成二進位 用來發送    NSData * sendData = [[NSData alloc]initWithBytes:tinfo length:sizeof(tinfo)];

  上面兩段代碼可以看出,定長結構體的每一個欄位都可以用相應的方法直接賦值,轉化為二進位的長度也是固定的。那如果是接受到的結構體,該怎麼取值呢?

    // 處理接受到的資料       NSData * receiveData;// 你收到的資料     char * k = new char[receiveData.length];    if(k) {//是否為空白        tagInfo * tinfo = new (k)tagInfo();        [receiveData getBytes:tinfo length:receiveData.length];        // 字串是需要轉換的        NSString * name = [[NSString alloc]initWithBytes:tinfo->sNickName length:64 encoding:NSUTF8StringEncoding];        NSString * accountNo = [[NSString alloc]initWithBytes:tinfo->sAccountNo length:64 encoding:NSUTF8StringEncoding];        int face = tinfo->nFace;        long cmd = tinfo->cmd;    }

 

不定長結構體

  這個使用的比較多。因為每次發送的訊息長度都是不一樣的,太長浪費流量,太短訊息內容少。

    typedef struct tagInfo {        int  nFace;        long cmd;        int  length;        char sNickName[60];        char sAccountNo[60];        char exInfo[1]; // 這個就是不定長的內容    }T_INFO,*PT_INFO;

  不定長的處理,關係到結構體的大小。

    // 賦值  data 為不定長的資料 NSData類型  char * l = new char[data.length+sizeof(tagInfo)];    if(l){      memset(l, 0, data.length+sizeof(tagInfo));      tagInfo * ksm = new(l) tagInfo();      // 算出結構體的長度 這個很關鍵      ksm->length = (uint32_t)(data.length) + (sizeof(tagInfo));      // 填充定長欄位 剛才那幾個欄位      ksm->nFace = 0;      ksm->cmd = 11;      ... ...      // 將不定長的資料拷貝到對應的地方      memcpy(ksm->bData, data.bytes, data.length);      // 轉換為可以發送的二進位      NSData * returnData = [[NSData alloc]initWithBytes:ksm length:ksm.length];}    

 反之接受的處理和定長的一樣。不過不定長的那個欄位的長度,需要通過length來計算。

  

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.