【问题标题】:NSLog show strange character instead of the JSONNSLog 显示奇怪的字符而不是 JSON
【发布时间】:2016-05-14 02:26:04
【问题描述】:

下面的代码可以处理我的服务器使用套接字发送的响应:

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,而不是没有len: 184Receive: ~,正如我们在上面的命令中第二次调用NSLog 中看到的那样.

我该如何解决这个问题?

【问题讨论】:

标签: objective-c nsstring nslog nsstream nsmutablestring


【解决方案1】:

您正在错误地构建字符串。您正在读取一系列字节,而不是字符串。因此,建立一个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);

【讨论】:

  • 它有效,我可以看到 NSData 的哈希值,但 NSString 总数返回 null,我相信当我将其转换为 NSArray 时,我可以看到值对吗?
  • 如果totalnildata 似乎有正确的数据量,那么字符串可能不是UTF-8 编码。你知道你的服务器使用的是什么字符串编码吗?
  • 如果你真的在使用 NSJSONSerialization,那么就没有必要创建一个字符串。直接传入data即可。虽然这仅在 NSData 是以 5 种特定编码之一编码的字符串时才有效(请参阅文档)。
猜你喜欢
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 2018-11-24
  • 2012-10-01
  • 2014-02-12
  • 2013-10-29
相关资源
最近更新 更多