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