iOS與安卓端的通訊data格式轉(zhuǎn)換

安卓跟iOS通訊的時(shí)候,你會(huì)發(fā)現(xiàn)你接到對(duì)方發(fā)的json串解析不了,對(duì),因?yàn)榘沧吭诎l(fā)送json的時(shí)候,安卓默認(rèn)的在數(shù)據(jù)的Byte前兩位加上了data總長(zhǎng)度,所以我們?cè)诮馕龅臅r(shí)候要先把接收到數(shù)據(jù)的前兩位解析出需要接受數(shù)據(jù)的大小長(zhǎng)度。然后我們就知道這段data只接收解析出長(zhǎng)度的大小。防止數(shù)據(jù)錯(cuò)亂!

還是上代碼

/**

*解析Json

*

*@param client_NeedFD客戶端標(biāo)識(shí)FD

*

*@return Json格式字符串

*/

- (NSString*)RecognizeDataWithClientFD:(int)client_NeedFD{

NSString*needReturnIn =nil;

charbuf[1024];

intallLength =0;

intbits =0;

NSInteger br;


//判斷是否是第一次1.第一次判斷前兩位長(zhǎng)度

BOOLisFirst =YES;

NSMutableData*mutableData = [[NSMutableDataalloc]init];

while((br =recv(client_NeedFD, buf,1024,0))!=-1) {//接受的長(zhǎng)度

//取到所有json

allLength +=br;

NSData*headData = [[NSDataalloc]initWithBytes:buflength:br];

[mutableDataappendData:headData];

if(isFirst) {

bits = [selfbytes_to_IntWithData:headDataLength:0];//應(yīng)該接受的長(zhǎng)度

isFirst =NO;

}

//1.如果已經(jīng)接收的總長(zhǎng)度allLehgth小于應(yīng)該接收的長(zhǎng)度Bits繼續(xù)接收

//2.否則break跳出該循環(huán)

//NSLog(@"allLength = %dbr = %d收到左右的JSON Break",allLength,br);

if((allLength -2) == bits) {

NSString*jsonString = [selfconvertToNSStringFromJavaUTF8:mutableDataWithLength:bits];

needReturnIn = jsonString;

break;

}

//memset(buf, 0, sizeof(buf));//總的作用:將已開(kāi)辟內(nèi)存空間s的首n個(gè)字節(jié)的值設(shè)為值c。函數(shù)常用于內(nèi)存空間初始化

if(br ==0) {

close(client_NeedFD);

break;

}

}returnneedReturnIn;

}

- (int)bytes_to_IntWithData:(NSData*)data Length:(int)len{//取出前兩位,計(jì)算出本次應(yīng)該接受的長(zhǎng)度

intvalue=0;

Byte*byte = (Byte*)[databytes];

if([datalength]>2) {//解析前兩位

value = (int)(byte[1+len] &0xFF)|(byte[0+len]<<8&0xFF00);

}

returnvalue;

}

- (NSString*) convertToNSStringFromJavaUTF8 : (NSData*) data WithLength:(int)len{

intlength = (int)[datalength];

constuint8_t*bytes = (constuint8_t*)[databytes];

if(length <2) {

returnnil;

}

bytes +=2;

return[[NSStringalloc]initWithBytes:byteslength:lenencoding:NSUTF8StringEncoding];

#if0 //+2就代表從第三位開(kāi)始,下面是例子,可以改變數(shù)字,自己試試

NSString *str1 =@"123456";

NSData *data1 = [str1 dataUsingEncoding:NSUTF8StringEncoding];

intlength = (int)[data1 length];

constuint8_t *bytes = (constuint8_t*)[data1 bytes];

NSString *json = [[NSString alloc] initWithBytes:bytes+2length:length-2encoding:NSUTF8StringEncoding];

XCLog(@"%@",json);

#endif

}

二、發(fā)送的時(shí)候記得也在發(fā)送的data前面加上你要發(fā)送json的長(zhǎng)度

- (NSInteger)sendSocketWithJson:(NSString*)jsonString SockFD:(int)sock_fd{

NSData*mutableData = [[DealwithJson shareInstance]NeedJsonString:jsonString];

Byte*sendByte = (Byte*)[mutableDatabytes];

returnsend(sock_fd, sendByte, [mutableDatalength],0);

}

//下面是在bytes前面加上長(zhǎng)度,注意bytes的高地位

- (NSData*)NeedJsonString:(NSString*)jsonStirng {

NSData*data1 = [jsonStirngdataUsingEncoding:NSUTF8StringEncoding];

#if __LP64__ || NS_BUILD_32_LIKE_64

//long sendSuccess;

NSIntegerbits = [data1length];

#else

//int sendSuccess;

intbits = [data1 length];

#endif

shortbit = bits;

NSData*data2 = [NSDatadataWithBytes:&bitlength:sizeof(bit)];//低位高位

Byte*testByte = (Byte*)[data2bytes];

/**

*修改byte高地位--適應(yīng)安卓

*/

intone = testByte[0];

testByte[0] = testByte[1];

testByte[1] = one;

NSData*data3 = [[NSDataalloc]initWithBytes:testBytelength:2];

NSMutableData*mutableData = [[NSMutableDataalloc]initWithData:data3];//先把長(zhǎng)度加上

[mutableDataappendData:data1];//要發(fā)出的數(shù)據(jù)

returnmutableData;

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,603評(píng)論 30 472
  • //NSdata 轉(zhuǎn)16進(jìn)制字符串- (NSString*)hexRepresentationWithSpaces...
    youngZhou閱讀 1,417評(píng)論 0 1
  • 轉(zhuǎn)自:http://www.code4app.com/blog-866962-1317.html1、設(shè)置UILab...
    MMOTE閱讀 1,887評(píng)論 1 1
  • 今天圣誕節(jié),走到哪里耳邊都是金敗夠金敗夠的音樂(lè),在這樣的氛圍里逛了半天一分錢沒(méi)敗也算是奇跡了。更多的是邊逛...
    秋米閱讀 211評(píng)論 0 1
  • 前言 前不久公司有個(gè)需求是任務(wù)需要按照權(quán)重分配來(lái)選擇,當(dāng)時(shí)就想到負(fù)載均衡算法里的加權(quán)隨機(jī)法,因此對(duì)常見(jiàn)的負(fù)載均衡算...
    FlySheep_ly閱讀 1,964評(píng)論 2 2

友情鏈接更多精彩內(nèi)容