iOS IM開發准備工作(五)iOS中的struct怎么處理


  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來計算。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM