2016-05-14 2 views
0

У меня есть этот код ниже, который обрабатывает ответ отправить на мой сервер с сокетами:NSLog показать странный характер вместо JSON

uint8_t buffer[4096]; 
     int len; 
     NSMutableString *total = [[NSMutableString alloc] init]; 
     while ([inputStream hasBytesAvailable]) { 
      len = (int)[inputStream read:buffer maxLength:sizeof(buffer)]; 
      if (len > 0) { 

       NSLog(@"Buffer: %s",buffer); 
       [total appendString: [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]]; 
       NSLog(@"Receive: %@, len: %d",total,len); 
       NSLog(@"len: %d, receive: %@",len,total); 

} 

} 

Мой сервер отправить текстовый файл, как это:

[{"name_user":"stack overflow","user_key":"XXXXXXX","type":21}] 

Проблема с этим кодом заключается в том, что если я отправлю этот JSON, журнал консоли отобразит длину этого JSON. Но если я посылаю этот JSON ниже:

[[{"name_user":"stack overflow","user_key":"XXXXXXX","type":21}],[{"name_user":"lacrifilm","user_key":"XXXXXXX","type":21}]] 

Это представляет два значения в формате JSON В журнале консоли:

Buffer: ~ 
Receive: ~ 
len: 184, receive: ~ 

Я считаю, что проблема не в моем сервере, потому что если бы это был я бы получение: Receive: ~, len: 184, вместо Receive: ~ без len: 184, как мы видели во втором вызове NSLog в моей команде выше.

Как я могу решить эту проблему?

+0

Возможный дубликат [Почему не бросает работу из NSData в String? Swift] (http://stackoverflow.com/questions/36894972/why-doesnt-cast-work-from-nsdata-to-string-swift) – Larme

ответ

2

Вы неправильно строите свою строку. Вы читаете серию байтов, а не фрагменты строки. Поэтому создайте файл NSMutableData, а затем создайте NSString, как только у вас есть все данные. Подробнее вот так:

uint8_t buffer[4096]; 
NSMutableData *data = [[NSMutableData alloc] init]; 
while ([inputStream hasBytesAvailable]) { 
    NSInteger len = [inputStream read:buffer maxLength:sizeof(buffer)]; 
    if (len > 0) { 
     //NSLog(@"Buffer: %s",buffer); // can't do this - buffer isn't a null-terminated C-string 
     [data appendBytes:buffer length:len]; 
     NSLog(@"Receive: %@, len: %d", data, (int)len); 
    } 
} 

NSString *total = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
NSLog(@"Total: %@", total); 
+0

Он работает, я вижу хэш NSData, но возвращается общая сумма NSString 'null', я считаю, что когда я конвертирую его в NSArray, я могу правильно оценить значения? – Lacrifilm

+2

Если 'total' является' nil', но 'data', похоже, имеет нужный объем данных, то строка может быть не в кодировке UTF-8. Вы знаете, какая строка кодирует ваш сервер? – rmaddy

+2

И если вы действительно используете NSJSONSerialization, тогда нет необходимости создавать строку. Просто передайте 'данные' напрямую. Хотя это работает только в том случае, если 'NSData' является строкой, закодированной в одном из 5 конкретных кодировок (см. Документы). – rmaddy