2016-05-14 106 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转换为字符串? 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